不确定如何使用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
}
答案 0 :(得分:2)
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#等)。