在if语句中使用PHP eval()

时间:2014-02-27 22:06:18

标签: php

不确定如何使用eval()我认为我正确阅读了文档并尝试这样做(我知道逻辑很糟糕,但我只是尝试了)。

if($showUnlisted){
     $unlistedIfStatement = '!$price || $car["sale_price"] == 0 ||($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"])';
}
else{
    $unlistedIfStatement = '!$price ||($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"])';
}
if(eval($unlistedIfStatement)){
        //DO SOME STUFF
}

我收到此错误:

Parse error: syntax error, unexpected end of file

查看这些示例(http://us1.php.net/eval),它应该将字符串中的任何内容作为一行代码运行。此定义“eval()函数也将字符串计算为PHP代码。”来自http://www.w3schools.com/php/func_misc_eval.asp基本上,我试图在变量中存储一行代码,并让它像在JavaScript中一样运行。非常新的PHP,如果我的问题很愚蠢,我很抱歉。

编辑: 我已经阅读了很多关于为什么eval()是一个糟糕工具的帖子,老实说,我只是出于好奇而问。

EDIT2:

meagar的代码非常出色,我必须做的唯一事情就是在字符串结束之前添加分号。我去编辑他的帖子,但我的编辑被拒绝了。这是代码对我有用....显然我会把它改成我同行不会嘲笑的东西。

if($showUnlisted){
    $unlistedIfStatement = 'return !$price || $car["sale_price"] == 0 ||($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"]);';
}
else{
    $unlistedIfStatement = 'return !$price ||($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"]);';
}
if(eval($unlistedIfStatement)){
    //DO SOME STUFF
}

2 个答案:

答案 0 :(得分:2)

您链接到的非常明确地

The documentation

  

eval()返回NULL,除非在计算代码中调用return,在这种情况下返回传递给return的值。

每个评估的行必须return一个值,或者评估为null

if($showUnlisted){
     $unlistedIfStatement = 'return !$price || $car["sale_price"] == 0 ||($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"])';
}
else{
    $unlistedIfStatement = 'return !$price ||($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"])';
}
if(eval($unlistedIfStatement)){
        //DO SOME STUFF
}

答案 1 :(得分:1)

如另一个答案所示,eval()在没有返回值的情况下返回null。但是,您实际需要的是callback

代码中的某处:

function showUnlisted() {
  return !$price || $car["sale_price"] == 0 || ($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"]);
}

function dontShowUnlisted() {
  return !$price ||($priceFrom <= $car["sale_price"] && $priceTo >= $car["sale_price"]);
}

然后,您需要在这些功能之间做出决定:

if ($showUnlisted) {
  $appropriateFunction = 'showUnlisted';
} else {
  $appropriateFunction = 'dontShowUnlisted';
}

if (call_user_func($appropriateFunction)) {
  //do stuff
}

这可以防止您成为evils of eval的牺牲品,让您测试这些功能,更有效地利用IDE,并更好地预测结果。将函数作为对象传递是一件有用的事情,虽然在PHP中很尴尬,但在更现代的语言中却很常见(Scala,C#等)。