我有一个表单,用户可以在其中创建自己的条件。 E.g
<select name="operator">
<option value="==">(==) Equal</option>
<option value="!=">(!=) - Not Equal</option>
<option value=">">(>) - Greater than</option>
<option value="<">(<) - Less than</option>
<option value=">=">(>=) - Greater than or equal to </option>
<option value="<=">(<=) - Less than or equal to </option>
</select>
我如何解析运算符以使其实际上是一个字符串但php将其解释为条件运算符?
if($column $operator $value){
}
这样做的长篇大论将是这样的:
switch($operator){
case '!=':
if($column != $value){
}
break;
case '<=':
case '<=':
if($column <= $value){
}
break;
}
答案 0 :(得分:3)
执行此操作的唯一方法是使用eval
将字符串计算为PHP代码。
出于安全原因,通常不建议使用eval
。使用switch
的当前方法是最佳解决方案。唯一的另一种选择是以类似的方式使用if
语句。
答案 1 :(得分:1)
间接答案
虽然PHP支持执行任意代码,但我建议你不来执行它。有其他选择!
对于这种情况,我会建议Strategy Pattern。它是一种允许在运行时选择行为的模式。恕我直言,你需要什么。
设置可能比switch
语句要多一些,但它更灵活,更易于维护。
直接回答
您可以使用eval()
(php.net):
if (eval("return \$column $operator \$value;")) {
}
但我强烈不鼓励你这样做:
eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。
我无法表达这一点:不要使用eval()
!