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 eval
ing since I assume that filter_var
would also handle sanitizing any input before piping it through eval
.