【问题标题】:Conditional statement is not working in if condition?条件语句在 if 条件下不起作用?
【发布时间】:2016-01-08 07:49:24
【问题描述】:

我正在使用动态创建条件的动态脚本,例如

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

当我尝试在if 条件下使用变量时,它不起作用。

if($condition_string) {

  // do something

}

但是,如果我使用

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

  // do something

}

然后就可以了。

有人可以告诉如何在条件中使用变量吗?

【问题讨论】:

  • 什么是 $rule_condition_string ?
  • 对不起,它是 $condition_string。
  • 我也试过 && in condition.. 但还是不行。
  • @M.Page:您可以在 PHP 中同时使用 &&ANDprecedence 略有不同)。
  • 变量不像复制和粘贴代码那样工作。 if ($string) 根据 PHP 的规则评估 $string 是否等于 true,这几乎意味着任何非空字符串都被视为 true。它不会读取字符串的内容并将它们评估为 PHP 代码,这是一件好事。

标签: php if-statement conditional-statements


【解决方案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】:
    $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
    }
    

    请注意,ANDprecedence= 运算符,因此您必须在表达式周围使用括号。如果您使用&& 运算符,则不需要这样做,它的优先级高于 =

    还要注意eval manual page 中的警告:

    注意

    eval() 语言结构非常危险,因为它允许执行任意 PHP 代码。因此不鼓励使用它。如果您已仔细验证除了使用此构造别无其他选择,请特别注意不要将任何用户提供的数据传入其中,而无需事先正确验证。

    【讨论】:

      【解决方案3】:

      您应该使用 eval 函数来构建和评估动态脚本,所以:

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

      会做的。

      【讨论】:

      • @ mark91 :感谢它的工作就像一个魅力。你救了我的命。
      【解决方案4】:

      还有另一种方法,虽然它涉及更多一点。但是,它避免使用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 条件比较每对数字是否相等。由于代码使用逻辑 ||运算符,当第二对数字计算为真时,条件也计算为真,输出确认字符串的净结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2011-12-04
        • 2012-08-15
        相关资源
        最近更新 更多