Я создаю класс 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 || ложный