赋值运算符作为php中的变量

时间:2014-08-18 06:39:40

标签: php variables variable-assignment operator-keyword

我正在尝试使用运算符作为变量。

$num1 = 33;
$num2 = 44;
$operator = "+";
$answer = ($num1.$operator.$num2);

打印“33 + 44”而不是77。

或者,

$operators = array(
   "plus"=>"+", 
   "minus"=>"-",
   "times"=>"*", 
   "div"=>"/"
  );

我希望能够使用:$answer = $num1.$operators["plus"].$num2;

如何在不使用“if”语句的情况下实现此目的?

$answer = ($operator == "+") ? $num1 + $num2 : 0;

4 个答案:

答案 0 :(得分:4)

    $num1 = 33;
    $num2 = 44;
    $operator = "+";
    eval("\$result = $num1 $operator $num2;"); 
    echo $result;

<强>注意 eval()语言构造非常危险,因为它允许执行任意PHP代码。因此不鼓励使用它。如果您已经仔细验证除了使用此构造之外没有其他选择,请特别注意不要将任何用户提供的数据传递到其中,而不事先正确验证它。

答案 1 :(得分:3)

在用户土地上

想想你想要达到的目标。为什么不创建固定代码闭包?您可以通过以下方式轻松完成:

$operators = array(
   "plus"=>function($x, $y)
   {
      return $x+$y;
   }, 
   "minus"=>function($x, $y)
   {
      return $x-$y;
   },
   "times"=>function($x, $y)
   {
      return $x*$y;
   }, 
   "div"=>function($x, $y)
   {
      return $x/$y;
   }
  );

//in PHP 5.5:
$result = $operators['plus']($num1, $num2);
//in PHP<5.5:
//$result = call_user_func_array($operators['plus'], [$num1, $num2])

现在你有两件事:首先,它仍然是动态代码 - 你可以在表达式中使用它。接下来,您在代码评估方面是安全的 - 因为您已经自己定义了代码。这种方法也有优势 - 您可以根据需要定义所需的行为。例如,如果第二个操作数为零,则为"div"运算符引发异常。

“轻松”的方式

我会注意到这只是为了解释为什么这不是正确的方法。可以使用eval()。就像:

eval('$result='.$num1.$operators['plus'].$num2.';');

然后您的结果将存储在$result变量中。这是“简单”的方式,但不是“正确”的方式。问题是 - 它是不安全的。试想一下 - 你正在执行一些动态的代码。如果您的代码与用户输入无关,则可能适用 - 如果您之前正在检查操作数和操作符。但我仍然建议在应用之前再三考虑。

如果还需要评估

然后我建议查看一些现有的实现。以下是一些链接:

答案 2 :(得分:1)

您可以尝试使用BC Math functions。这个例子适用于PHP 5.5:

$num1 = 33;
$num2 = 44;
$operator = '+';
$funcs = array(
    '+' => 'bcadd',
    '-' => 'bcsub',
    '/' => 'bcdiv',
    '*' => 'bcmul',
    );

$answer = $funcs[$operator]($num1, $num2); // 77

答案 3 :(得分:0)

我问为什么你想首先将算术运算符作为字符串传递,但这是一种不使用if语句的方法:

function fancy_math($num1 = 0, $num2 = 0, $operator = '+')
{
    switch ($operator) {
        case 'minus':
        case '-':
            return $num1 - $num2;
            break;

        case 'times':
        case '*':
            return $num1 * $num2;
            break;

        case 'div':
        case '/':
            return ($num2 !== 0) ? $num1 / $num2 : 'Error: divide by zero';
            break;

        default:
            return $num1 + $num2;
            break;
    }
}

然后像这样称呼它:

$answer = fancy_math($num1, $num2, $operator);

请注意,您可以将'minus''-'(等)作为$operator传递,因为它会同时接受这两者。如果您未传递$operator,则会自动采用'plus''+'