2011-07-16 135 views
0

我试图通过检查变量来避免重复我的代码,如果它是某个运算符。运算符(操作数?)作为参数

基本上..

$op = $_POST['operator']; 
$x = 5; 
$y = 2; 
$result = $x /* $op instead of '+'/'-'/'*'/'/'/'%' */ $y; 

这是可能的,或者我会送运营商作为一个字符串和重复每个运营类型的代码?

回答

2

这是一个很大安全做这样的事情:

$x = 5; 
$y = 2; 

switch($_POST['operator']){ 
    case '+': 
     $result = $x + $y; 
     break; 
    case '-': 
     $result = $x - $y; 
     break; 
    case '*': 
     $result = $x*$y; 
     break; 
    case '/': 
     $result = $x/$y; 
     break; 
    case '%': 
     $result = $x % $y; 
     break; 
    default: 
     $result = 'Operator not supported'; 
} 

类似的规定。

+0

相当长,但仍然比'eval()更好'使用eval的恕我直言 – Sufendy

1

Ahem。你可以eval

$result = eval("$x $op $y"); 

但这危险,你应该非常小心净化你的变量。有一种说法就像“如果你的问题需要使用eval,那么问题就是错误的。”类似的东西。这几乎当然是更好的做这样的事情:

function apply_op($x, $y, $op) { 
    switch ($op) { 
    case '+': return $x + $y; 
    ... 
    } 
} 
+0

所有参数将被适当处理。谢谢! :) –

+2

而eval往往表明你做错了某件事 - 它的重量远远超过危险 - 即使是在大写字母和粗体字中) – hakre

+0

@hakre:我通常会说“危险的”比“错误的”更糟糕, 。 –

0

可以让这个:

$operators = array("+", "-","*","%","/"); 
$op = $_POST["operator"]; 
if(in_array($op, $operators)) { 
    echo eval("$x $op $y"); 
} else { 
    echo "Operator not supported"; 
} 
+0

在这种情况下是相当危险的,因为$ op是用户输入。用户可以输入任何内容,包括执行一些危险的PHP代码。 – Sufendy