Как разбирать строку логической логики в PHP

Я создаю класс PHP с частной функцией-членом, которая возвращает строковое значение, такое как:

'true && true || false' 

к функции открытого участника. (Эта строка является результатом некоторого соответствия регулярных выражений и поиска свойств.) Я хотел бы сделать, чтобы PHP проанализировал возвращаемую логику и возвратил вышеупомянутую публичную функцию, является ли логический результат анализируемой логики истинным или ложным.

Я попробовал eval (), но я не получаю никакого вывода. Я попробовал typecasting логических возвратов … но нет никакого способа для операторов-операторов … хехе Какие-нибудь идеи? (Дайте мне знать, если вам нужна дополнительная информация.)

Просто наткнулся на этот вопрос, но, будучи довольно непростым в использовании eval , я решил продолжить поиск лучшего решения.

Я обнаружил, что это еще одно замечательное использование для функции filter_var PHP, когда вы FILTER_VALIDATE_BOOLEAN флаг FILTER_VALIDATE_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); } 

И, немного тестирования:

 /** * 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"; } 

Вывод:

 /* 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) */ 

Я не выглядел достаточно глубоко, но вполне возможно, что это решение опирается на eval вниз по eval то линии, но я все же filter_var с тем, чтобы использовать те, которые были более filter_var поскольку я предполагаю, что filter_var также будет обрабатывать санирование любого ввода до его filter_var через eval .

eval() будет отлично работать для этого, но помните, что вы должны сказать ему, чтобы что-то вернуть.

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

Также убедитесь, что вы дезинфицируете любые пользовательские входы, если их прямо eval() в eval() .

Предположим, что eval () – это хорошее / хорошее решение в вашем случае.

 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); 

печатает bool(true)

(string) true && true || ложный