Сравнение условий построения для оператора if - PullRequest
2 голосов
/ 02 июня 2011

Возможно ли это?

$var_1 = 1;
$var_2 = 10;
$comparison = '>';

if($var_1 $comparison $var_2) {
    // do something...
}

Синтаксис сейчас недействителен, но есть ли способ сделать это?

Ответы [ 6 ]

9 голосов
/ 02 июня 2011

Не изначально (кроме, конечно, с 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...
}
5 голосов
/ 02 июня 2011

Это возможно с

if (eval("{$var_1} {$comparison} {$var_2}")) {

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

РЕДАКТИРОВАТЬ Как заметил @mario, до PHP 5.3 это не работает.В 5.3 это делает.Так что для более старых версий это должно быть

if (eval("return {$var_1} {$comparison} {$var_2};")) {
3 голосов
/ 02 июня 2011

Вы, вероятно, должны использовать eval().Как и в других языках программирования, PHP eval() также мощный и опасный - будьте осторожны.

Если вы напишите что-то вроде следующего кода:

if (eval("$var_1 $comparison $var_2")) {
    // ...
}

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

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.
0 голосов
/ 09 января 2016

делает строку условной, возвращая значение, если истина или ложь

краткая форма, если инструкция

$var_1 = 1;
$var_2 = 10;
$comparison = '>=';

eval("\$b=$var_1 $comparison $var_2?1:0;");

if ($b) {
//do something
}
0 голосов
/ 02 июня 2011

Вы также можете создать несколько функций, таких как 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
}

Похоже, у вас есть несколько вариантов. Надеюсь, это поможет.

0 голосов
/ 02 июня 2011

Я не уверен, возможно ли это без хакерского использования оператора 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

Но первый метод, вероятно, гораздо предпочтительнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...