动态条件返回String


Dynamic Conditional String

下面的代码部分取自一个函数:

$dynamic_comparison = '';  
if(($from == '')&&($to == '')){
    $dynamic_comparison = 1;
}else if(($from != '')&&($to != '')){
    $dynamic_comparison = '($row >= $from) && ($row <= $to)';
}else if(($from != '')&&($to == '')){
    $dynamic_comparison = '($row >= $from)';
}else if(($from == '')&&($to != '')){
    $dynamic_comparison = '($row <= $to)';
}

$form$to$row为函数参数。

我想把$dynamic_comparison计算成这样:

if($dynamic_comparison){
    //A bunch of code here...
}

我试着:

if(eval($dynamic_comparison)){
    //A bunch of code here...
}

抛出错误。如何做到这一点呢?

eval()是个坏主意。你可以使用匿名函数,像这样

$dynamic_comparison = function($row, $to, $from) { return false };  
if(($from == '')&&($to == '')){
    $dynamic_comparison = function($row, $to, $from) { return true;};
}else if(($from != '')&&($to != '')){
    $dynamic_comparison = function($row, $to, $from) { return ($row >= $from) && ($row <= $to);};
}else if(($from != '')&&($to == '')){
    $dynamic_comparison = function($row, $to, $from) { return ($row >= $from);};
}else if(($from == '')&&($to != '')){
    $dynamic_comparison = function($row, $to, $from) { return ($row <= $to);};
}

一样使用
if($dynamic_comparison($row, $to, $from))...

如果你想使用eval:

$dynamic_comparison = 'return false;';  
if(($from == '')&&($to == '')){
    $dynamic_comparison = 'return true;';
}else if(($from != '')&&($to != '')){
    $dynamic_comparison = 'return ($row >= $from) && ($row <= $to);';
}else if(($from != '')&&($to == '')){
    $dynamic_comparison = 'return ($row >= $from);';
}else if(($from == '')&&($to != '')){
    $dynamic_comparison = 'return ($row <= $to);';
}
if(eval($dynamic_comparison)){//$to,$from,$row must be available in this scope

我认为你必须使用双引号而不是单引号为你的字符串,像这样:

<?php 
$dynamic_comparison = '';  
if(($from == '')&&($to == '')){
    $dynamic_comparison = 1;
}else if(($from != '')&&($to != '')){
    $dynamic_comparison = "($row >= $from) && ($row <= $to)";
}else if(($from != '')&&($to == '')){
    $dynamic_comparison = "($row >= $from)";
}else if(($from == '')&&($to != '')){
    $dynamic_comparison = "($row <= $to)";
}

如果此时没有初始化$row,转义$ character:

<?php 
    $dynamic_comparison = '';  
    if(($from == '')&&($to == '')){
        $dynamic_comparison = 1;
    }else if(($from != '')&&($to != '')){
        $dynamic_comparison = "('$row >= $from) && ('$row <= $to)";
    }else if(($from != '')&&($to == '')){
        $dynamic_comparison = "('$row >= $from)";
    }else if(($from == '')&&($to != '')){
        $dynamic_comparison = "('$row <= $to)";
    }

参见eval()文档:http://php.net/manual/en/function.eval.php