Это возможно?
$var_1 = 1; $var_2 = 10; $comparison = '>'; if($var_1 $comparison $var_2) { // do something... }
Синтаксис прямо сейчас недействителен, но есть ли способ сделать это?
Не изначально (кроме, конечно, с eval
). Вам нужно будет оценить различные выражения самостоятельно. Создайте функцию обертки и используйте оператор switch
. Или для сравнения без выражения простая карта:
$var_1 = 1; $var_2 = 10; $comparison = '>'; $map = array( ">" => $var_1 > $var_2, "<" => $var_1 < $var_2, "==" => $var_1 == $var_2, "!=" => $var_1 != $var_2, ); if($map[$comparison]) { // do something... }
Это возможно с помощью
if (eval("{$var_1} {$comparison} {$var_2}")) {
Но eval
сильно обескуражен, поэтому делайте это только в том случае, если вы не можете добиться желаемого результата иначе
EDIT Как отметил @mario, до тех пор, пока PHP 5.3 это не сработает. В 5.3 это делается. Поэтому для более старых версий это должно быть
if (eval("return {$var_1} {$comparison} {$var_2};")) {
Вероятно, вы должны использовать eval()
. Как и в других языках программирования, PHP eval()
также является мощным и опасным – будьте осторожны.
Если вы напишете что-то вроде следующего кода:
if (eval("$var_1 $comparison $var_2")) { // ... }
Это не сработает. Поскольку eval()
PHP не оценивает выражение , а просто выполняет оператор . Поэтому вам следует:
eval("\$condition = $var_1 $comparison $var_2;"); // semicolon required! if ($condition) { // ... }
Он будет работать хорошо, кроме $var_1
или $var_2
не является числом. Например, если $var_1
– это строка, подобная 'hello'
, код eval()
выполняется:
eval("\$condition = hello > 2;");
Чтобы не нарушать этот код, вам следует избегать знаков доллара $var_1
и $var_2
:
eval("\$condition = \$var_1 $comparison \$var_2;"); // don't escape $comparison's.
Я не уверен, что это возможно без хакерского использования выражения eval. Вы могли бы, конечно, обернуть просто проверить, какое сравнение используется в другом выражении if.
if($comparison == '>' && $var_1 > $var_2) //Do something elseif($comparison == '<' && $var_1 < $var_2) //Do something, and so on
Метод eval также должен работать, если вы создадите код в строку.
if(eval("$var_1 $comparison $var_2")) //Do something
Но первый способ, вероятно, гораздо более предпочтительный.
Вы также можете создать несколько функций, таких как isGreaterThan ($ arg1, $ arg2), isLessThan ($ arg1, $ arg2), а затем сохранить имя функции, которую вы хотите в переменном $ сравнения. Затем вы должны использовать call_user_func_array (), когда хотите его использовать. Вот так :
function isGreaterThan($val1, $val2) { return $val1 > $val2; } ///////////// $var_1 = 1; $var_2 = 10; $comparison = "isGreaterThan"; if(call_user_func_array($comparison, array($var_1, var_2))) { //do something }
Похоже, у вас есть несколько вариантов. Надеюсь это поможет.
$var_1 = 1; $var_2 = 10; $comparison = '>='; eval("\$b=$var_1 $comparison $var_2?1:0;"); if ($b) { //do something }