if (foo >= bar) baz();
但是,有时候说baz();需要在foo <= bar
或foo == bar
...时运行...让我们说这个比较运算符是从db表中获取的,并放入变量:$param = ">="
。< / p>
除了带有多个if语句的switch-case之外,还有什么办法可以修改第一行使用$param
吗?
在我的代码中,baz();
跨越了大量的行,如果我手工管理它,将成为组织的噩梦。
答案 0 :(得分:9)
function lt($a, $b)
{
return $a < $b;
}
...
$relops = Array(
'<' => 'lt',
...
);
echo $relops['<'](2, 3);
答案 1 :(得分:3)
我用以下方法解决了这个问题:
function doComparison($a, $operator, $b)
{
switch ($operator) {
case '<': return ($a < $b); break;
case '<=': return ($a <= $b); break;
case '=': return ($a == $b); break; // SQL way
case '==': return ($a == $b); break;
case '!=': return ($a != $b); break;
case '>=': return ($a >= $b); break;
case '>': return ($a > $b); break;
}
throw new Exception("The {$operator} operator does not exists", 1);
}
答案 2 :(得分:1)
使用eval()?
$param = ">=";
eval ("if (foo $param bar ) baz();");
在eval功能的文档页面上阅读更多内容。
编辑:
事实上,正如其他人所提到的,如果有其他选择,它们几乎总是优于eval()。如果使用,必须小心使用。
答案 3 :(得分:0)
详细说明我的评论:
function variableOpComparison($v1, $v2, $o) {
if ($o == '!=') return ($v1 != $v2); // could put this elsewhere...
$operators = str_split($o);
foreach($operators as $operator) {
switch ($operator) { // return will exit switch, foreach loop, function
case '>': if ($v1 > $v2) return true; else continue; break;
case '<': if ($v1 < $v2) return true; else continue; break;
case '=': if ($v1 == $v2) return true; else continue; break;
default: throw new Exception('Unrecognized operator ' . $operator . ' in ' . $o);
}
}
return false;
}