How to parse a string of boolean logic in PHP

后端 未结 3 1726
醉酒成梦
醉酒成梦 2020-12-28 09:12

I\'m building a PHP class with a private member function that returns a string value such as:

\'true && true || false\'

to a public

相关标签:
3条回答
  • 2020-12-28 09:36

    Let's assume eval() is an ok/good solution in your case.

    class Foo {
      private function trustworthy() {
        return 'true && true || false';
      }
    
      public function bar() {
        return eval('return '.$this->trustworthy().';');
      }
    }
    
    $foo = new Foo;
    $r = $foo->bar();
    var_dump($r);
    

    prints bool(true)

    0 讨论(0)
  • 2020-12-28 09:45

    eval() will work perfectly fine for this, but remember you have to tell it to return something.

    $string = "true && true || false";
    $result = eval("return (".$string.");"); // $result will be true
    

    Also make sure you sanitize any user inputs if putting them directly into an eval().

    0 讨论(0)
  • 2020-12-28 09:54

    Just stumbled upon this question, but being fairly uneasy about using eval, I decided to keep looking for a better solution.

    What I discovered is yet another wonderful use for PHP's filter_var function, when passing in the FILTER_VALIDATE_BOOLEAN flag (of which there are many).

    This "one line" function seems to do well at safely converting a string (or other) object to a boolean:

    <?php
    
    /**
     * Uses PHP's `filter_var` to validate an object as boolean
     * @param string $obj The object to validate
     * @return boolean
     */
    function parse_boolean($obj) {
        return filter_var($obj, FILTER_VALIDATE_BOOLEAN);
    }
    

    And, a little testing:

    /**
     * Let's do some testing!
     */
    $tests = array (
        "yes",
        "no",
        "true",
        "false",
        "0",
        "1"
    );
    
    foreach($tests as $test) {
    
        $bool = parse_boolean($test);
    
        echo "TESTED: ";
        var_dump($test); 
    
        echo "GOT: ";
        var_dump($bool);
    
        echo "\n\n";
    
    }
    

    Output:

    /*
    TESTED: string(3) "yes"
    GOT: bool(true)
    
    
    TESTED: string(2) "no"
    GOT: bool(false)
    
    
    TESTED: string(4) "true"
    GOT: bool(true)
    
    
    TESTED: string(5) "false"
    GOT: bool(false)
    
    
    TESTED: string(1) "0"
    GOT: bool(false)
    
    
    TESTED: string(1) "1"
    GOT: bool(true)
    */
    

    I haven't looked deep enough, but it's possible that this solution relies on eval down the line somewhere, however I'd still side with using those over plain evaling since I assume that filter_var would also handle sanitizing any input before piping it through eval.

    0 讨论(0)
提交回复
热议问题