我正在使用动态脚本来动态创建条件,如
$condition_string = '1==0 AND 1==1';
当我尝试在if
条件下使用变量时,它不起作用。
if($condition_string) {
// do something
}
但是,如果我使用
if(1==0 AND 1==1) {
// do something
}
然后它有效。
有人可以告诉如何在条件下使用变量吗?
答案 0 :(得分:1)
$condition_string = '1==0 AND 1==1'; if($condition_string) { // do something }
if
语句中的条件在评估之前将为converted to boolean
。除非字符串为空字符串或字符串TRUE
,否则字符串将被评估为"0"
。因此,您的上述条件将始终如此。
一种选择是使用eval
来评估if
之外的条件:
eval ('$condition_string = (1==0 OR 1==1);');
if($condition_string) {
// do something
}
请注意,AND
的低于<{em} precedence而不是=
运算符,因此您必须在表达式周围使用括号。如果您使用{em>高于优先级高于&&
的{{1}}运算符,则无需执行此操作。
还请注意eval
manual page中的警告:
注意
eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。
答案 1 :(得分:1)
我会创建一个使用eval
的函数,但请注意PHP manual for 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
}
答案 2 :(得分:0)
您应该使用eval函数来构建和评估动态脚本,所以:
eval("if($condition_string){ /*do here what you need*/ }else{ /*...*/}");
可以胜任。
答案 3 :(得分:0)
还有另一种方法,尽管它涉及的更多一些。但是,它避免使用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被拆分为一个列表,其中包含采用其值的变量。 if条件比较每对数字是否相等。由于代码使用逻辑||运算符,当第二对数字的计算结果为真时,条件也会以输出的确认字符串的最终结果计算为真。