I'm building a PHP class with a private member function that returns a string value such as:
'true && true || false'
to a public member function. (This string is the result of some regex matching and property lookups.) What I'd like to do is have PHP parse the returned logic and have the aforementioned public function return whether the boolean result of the parsed logic is true or false.
I tried eval(), but I get no output at all. I tried typecasting the boolean returns...but there's no way to typecast operators...hehe Any ideas? (Let me know if you need more information.)
To explicitly convert a value to bool, use the (bool) or (boolean) casts.
PHP empty() Function The empty() function checks whether a variable is empty or not. This function returns false if the variable exists and is not empty, otherwise it returns true. The following values evaluates to empty: 0.
NULL essentially means a variable has no value assigned to it; false is a valid Boolean value, 0 is a valid integer value, and PHP has some fairly ugly conversions between 0 , "0" , "" , and false .
The boolean values are called true and false in php. In the case of true , the output is 1 . While with the false , it does not show any output.
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
.
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()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With