Условное заявление не работает, если условие?

Я использую динамический скрипт, который создает условия динамически, как

$condition_string =  '1==0 AND 1==1';

Когда я пытаюсь использовать переменную в if условие, оно не работает.

if($condition_string) {

// do something

}

Однако, если я использую

if(1==0 AND 1==1) {

// do something

}

тогда это работает.

Может кто-нибудь сказать, как использовать переменную в условии?

1

Решение

Вы должны использовать функцию eval для построения и оценки динамического скрипта, поэтому:

 eval("if($condition_string){ /*do here what you need*/ }else{ /*...*/}");

сделал бы работу.

0

Другие решения

Я бы сделал функцию, которая использует evalОбратите внимание, что это указано в Руководство по PHP для eval:

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

function eval_str($string) {
return eval("return $string;");
}

Тогда вы можете назвать это так

$condition_string = '1==0 AND 1==1';
if(eval_str($rule_condition_string)) { // false
// code
}
1

$condition_string =  '1==0 AND 1==1';

if($condition_string) {
// do something
}

Состояние в if заявление будет конвертировано в boolean прежде чем это будет оценено. Строка будет оценена как TRUE если это не пустая строка или строка "0", Следовательно, ваше условие выше всегда будет верным.

Одним из вариантов является использование eval оценить состояние за пределами if:

eval ('$condition_string = (1==0 OR 1==1);');

if($condition_string) {
// do something
}

Обратите внимание, что AND имеет ниже старшинство чем = оператор, поэтому вы должны использовать круглые скобки вокруг выражения. Это не обязательно, если вы используете && оператор, который имеет выше приоритет чем =,

Обратите внимание также на предупреждение в eval страница справочника:

предосторожность

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

1

Есть другой подход, хотя он немного сложнее. Тем не менее, он избегает использования eval, а именно:

<?php
$condition_string =  '1==0 || 1==1';
$arr = preg_split("/[ ==||]+/",$condition_string );
$callback = function( $s ){
return (int) $s;
};
$arrNums = array_map( $callback,$arr );
list( $n1, $n2, $n3, $n4 ) = $arrNums;
if (($n1 == $n2 ) || ( $n3 == $n4 )) {
echo "result of logical ||: this works\n";
}
// result of logical ||: this works

preg_split ищет, содержит ли строка пробел, == или ||. В этом случае строка разбивается на массив строк, содержащий только цифры. Arrap_map создает новый массив, который содержит целые числа, соответствующие каждой числовой строке в $ arr. $ arrNums разделяется на список, который содержит переменные, которые принимают его значения. Условное условие сравнивает каждую пару чисел на равенство. Поскольку код использует логический || оператор, когда вторая пара чисел оценивается как истинное, условное вычисляется также как истинное с чистым результатом выведенной строки подтверждения.

0
По вопросам рекламы [email protected]