PHP 解析字符串作为条件运算符

PHP parse string as condition operator

提问人:John Magnolia 提问时间:3/6/2014 更新时间:3/6/2014 访问量:1459

问:

我有一个表单,用户可以在其中创建自己的条件。F.D.(英语:F.D.)

<select name="operator">
    <option value="==">(==) Equal</option>
    <option value="!=">(!=) - Not Equal</option>
    <option value="&gt;">(&gt;) - Greater than</option>
    <option value="&lt;">(&lt;) - Less than</option>
    <option value="&gt;=">(&gt;=) - Greater than or equal to </option>
    <option value="&lt;=">(&lt;=) - Less than or equal to </option>
</select>

我怎样才能解析运算符,使其实际上是一个字符串,但 php 将其解释为条件运算符?

if($column $operator $value){

}

冗长的方法是这样的:

switch($operator){
    case '!=':
        if($column != $value){

        }
    break;
    case '<=':
    case '&lt;=':
        if($column <= $value){

        }
    break;
}
PHP的

评论

0赞 aksu 3/6/2014
使用变量作为运算符的可能重复项
4赞 Alma Do 3/6/2014
“简短”的答案:使用“长”的方式。不要使用 .eval()

答:

3赞 Mitch Satchwell 3/6/2014 #1

唯一的方法是使用 eval,它将字符串计算为 PHP 代码。

出于安全原因,通常不建议使用。您当前使用的方法是最好的解决方案。唯一的其他选择是以类似的方式使用语句。evalswitchif

1赞 Jasper N. Brouwer 3/6/2014 #2

间接回答

虽然PHP支持执行任意代码,但我建议你不要这样做。还有其他选择!

对于这种情况,我建议使用策略模式。这是一种允许在运行时选择行为的模式。恕我直言,正是你需要的。

与语句相比,设置起来可能要多一些,但它更加灵活和可维护。switch

直接回答

您可以使用 (php.net) 来实现此目的:eval()

if (eval("return \$column $operator \$value;")) {
}

但我强烈建议你不要这样做:

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

我不能表达这一点:不要使用 eval()

评论

1赞 thpl 3/6/2014
+1 在这里推荐策略模式!但是请把 eval() 段落放在你真正非常好的观点下面,这样就没有人会想使用 eval 方法了。
1赞 Jasper N. Brouwer 3/6/2014
@thomas-david-plat 瞧!