I\'m building a PHP class with a private member function that returns a string value such as:
\'true && true || false\'
to a public
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)
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().
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.