让我们考虑以下代码:
/**
* @param string $exp expression
* @param number $var1
* @param number $var2
* @return json
*/
public function calculate($exp, $var1, $var2) {}
处理此计算功能的最快捷,最优雅的方法是什么?
我是否仅限于'开关'?或者是否有可能以某种方式实现
$var1 . $exp . $var2
哪个会导致总和而不是字符串?
对此进行了一些繁重的研究,这真是微不足道的问题,但它让我思考了几个小时。
答案 0 :(得分:2)
简单,使用以下逻辑;
<?php
function c($e, $a, $b) {
$e = create_function("", "return (" . $a . $e . $b . ");" );
return 0 + $e();
}
echo c("+", 1, 2);
create_function
创建一个anonymous lambda - 样式的函数,该函数在运行时创建,而不是保存在内存中。它允许比switch
更灵活,因为您不必为运营商添加case
语句,但它会执行内部eval()
,因此你需要做一些数据验证。
答案 1 :(得分:0)
你可以使用eval()
这是最简单的,但是,它也是一个非常危险的函数,所以如果你要使用它,你必须实现一些验证,检查以确保只有正确的操作符被传递,这实际上使它不值得使用。
我会坚持使用switch语句:
public function calculate($exp, $var1, $var2) {
switch($char) {
case '=': return $var1 = $var2;
case '*': return $var1 * $var2;
case '+': return $var1 + $var2;
case '-': return $var1 - $var2;
}
}