【问题标题】:how to make dynamic conditions in operators in if conditions如何在 if 条件下在运算符中创建动态条件
【发布时间】:2021-12-26 13:06:24
【问题描述】:

我必须使用 &&|| 运算符制作每个条件都是动态的过滤器,因为我在下面的代码中制作了

    <?php
    $a = 5;
    $b = 2;
    $grater = '<';
    $equal = '==';
    $and = '&&';
    
    if(($a .$equal. $b)){
        echo 'hii';
    }else{
        echo 'hello';
    }
?>

但是当我使用此代码时,它无法正常工作。有人可以帮我吗

【问题讨论】:

    标签: php conditional-statements


    【解决方案1】:

    试试这个:

    if (eval("($a . $equal . $b)"))
    

    【讨论】:

    • 重要提示: 仅当您 100% 控制这些变量中的所有值时才执行此操作。如果是用户输入,或者这些变量来自其他可以被其他人操作的外部源/源,请不要在它们上使用eval(),因为这将允许人们在您的服务器上运行任意的 PHP 代码。
    【解决方案2】:

    如果你将字符串连接成条件,这将导致字符串,所以你不会得到 if(5 == 2) 但你会得到 if("5 == 2") 这将永远是真的,因为 php 会将任何非空字符串评估为真。您需要评估此字符串,例如: if(eval($a . $equal . $b)) 但使用 eval 是不好的做法 https://www.php.net/manual/en/function.eval.php

    【讨论】:

    • @silentwasd 当我使用这个 eval() 时,它给了我“语法错误,意外的 'PEN' (T_STRING)”错误
    【解决方案3】:

    您可以像这样使用match expression

    function compute($operator, $a, $b)
    {
        return match ($operator) {
            '<'  => ($a <  $b),
            '==' => ($a == $b),
            '&&' => ($a && $b),
        };
    }
    
    var_dump(compute('==', 5, 2));
    

    这有三个好处:

    1. 您避免使用eval()
    2. 它也适用于字符串。
    3. 很容易扩展到其他运算符。

    【讨论】:

    • 我也试过这个代码 "if(eval(($column .$filter. $val) .$operator. ($column3 .$filter3. $val3) )){return true ;}” 但它不被视为条件并给出此错误“语法错误,意外'PEN'(T_STRING)”
    • @Mohini 对不起,我不明白你的评论。为什么添加代码和错误似乎完全无关。
    • 我使用if(eval(($column .$filter. $val) .$operator. ($column3 .$filter3. $val3) )){return true;}这个条件,它给了我这个错误
    【解决方案4】:

    您可以使用eval 执行此操作,正如其他答案所建议的那样。如果您选择此路径,请注意您需要防范PHP injection,这本身就是一个非常复杂的主题。您将需要验证操作数和运算符。虽然这是可能的,并且假设它已正确验证它也是安全的,但它是一个不干净、hacky 的解决方案,您将始终担心 PHP 代码注入,每当您更改代码时,您也需要更改验证器, 危险总是迫在眉睫。

    因此,我提出功能的实现,比如:

    function equal($a, $b, $strict = false) {
        return $strict ? ($a === $b) : ($a == $b);
    }
    

    然后你可以做类似的事情:

    if (equal($a, $b)) {
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多