在php中作为变量的赋值运算符
我试图使用运算符作为变量在php中作为变量的赋值运算符,php,variables,variable-assignment,operator-keyword,Php,Variables,Variable Assignment,Operator Keyword,我试图使用运算符作为变量 $num1 = 33; $num2 = 44; $operator = "+"; $answer = ($num1.$operator.$num2); 它打印的是“33+44”,而不是77 或者 我希望能够使用as:$answer=$num1.$operators[“plus”]。$num2 如果不使用“if”语句,如何实现这一点 $answer = ($operator == "+") ? $num1 + $num2 : 0; 你可以尝试使用。此示例适用于php
$num1 = 33;
$num2 = 44;
$operator = "+";
$answer = ($num1.$operator.$num2);
它打印的是“33+44”,而不是77
或者
我希望能够使用as:$answer=$num1.$operators[“plus”]。$num2代码>
如果不使用“if”语句,如何实现这一点
$answer = ($operator == "+") ? $num1 + $num2 : 0;
你可以尝试使用。此示例适用于php 5.5:
$num1 = 33;
$num2 = 44;
$operator = '+';
$funcs = array(
'+' => 'bcadd',
'-' => 'bcsub',
'/' => 'bcdiv',
'*' => 'bcmul',
);
$answer = $funcs[$operator]($num1, $num2); // 77
你可以尝试使用。此示例适用于php 5.5:
$num1 = 33;
$num2 = 44;
$operator = '+';
$funcs = array(
'+' => 'bcadd',
'-' => 'bcsub',
'/' => 'bcdiv',
'*' => 'bcmul',
);
$answer = $funcs[$operator]($num1, $num2); // 77
小心
eval()语言构造非常危险,因为它允许执行任意PHP代码。因此,不鼓励使用它。如果您已经仔细验证了除了使用此构造之外没有其他选择,请特别注意,在未事先正确验证的情况下,不要将任何用户提供的数据传递到该构造中
小心
eval()语言构造非常危险,因为它允许执行任意PHP代码。因此,不鼓励使用它。如果您已经仔细验证了除了使用此构造之外没有其他选择,请特别注意,在未事先正确验证的情况下,不要将任何用户提供的数据传递到该构造中。在用户土地上
想想你想要实现的事情。为什么不创建固定代码闭包?您可以通过以下方式轻松完成:
$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])
然后您的结果将存储在$result
变量中。这是关于“简单”的方式,但不是“正确”的方式。问题是——这是不安全的。想想看,你正在执行一些代码,这是动态的。如果您的代码与用户输入无关,那么它可能是适用的——在这种情况下,如果您之前正在检查操作数和运算符。但我仍然建议在使用它之前要三思
如果仍然需要评估
然后,我建议查看一些现有的实现。以下是一些链接:
在用户土地上
想想你想要实现的事情。为什么不创建固定代码闭包?您可以通过以下方式轻松完成:
$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])
然后您的结果将存储在$result
变量中。这是关于“简单”的方式,但不是“正确”的方式。问题是——这是不安全的。想想看,你正在执行一些代码,这是动态的。如果您的代码与用户输入无关,那么它可能是适用的——在这种情况下,如果您之前正在检查操作数和运算符。但我仍然建议在使用它之前要三思
如果仍然需要评估
然后,我建议查看一些现有的实现。以下是一些链接:
我想知道为什么首先要将算术运算符作为字符串传递,但这里有一种不用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);
注意:您可以将'减号'
或'-'
(等)作为$运算符传递,因为它将同时接受这两个运算符。如果不传递$运算符
,它将假定'plus'
或'+'
自动传递。我想知道为什么首先要将算术运算符作为字符串传递,但这里有一种不使用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);
注意:您可以将'减号'
或'-'
(等)作为$运算符传递,因为它将同时接受这两个运算符。如果您没有传递$运算符
,它将自动假定'plus'
或'+'
。您不能无条件地执行此操作,除非您使用eval
,否则不使用eval即可执行此操作。请看我的答案。你不能没有条件就这样做,除非你使用eval
这不使用eval是可行的。请看我的答案。如果是“div”,请返回字符串或数字?类型安全比较,而不在检查类型之前?事实上,不好的想法,因为整个事情都属于“不好的想法”的范畴。我可以让电位除以零,就像你做的那样。否则,我们的两个解决方案以相同的方式解决问题。我的是死板的基础和运行的任何地方。你的需要5.5或笨拙的调用_user_func_array()。实际上,使用PHPYes,而且驾驶任何低于当前车型年款的车辆都很糟糕。事实上,道路上的大多数汽车都不是今年的;大多数PHP主机也不是5.5,现实情况是PHP版本与汽车无关。使用旧版本至少是不安全的。大多数软件也是如此。如果没有理由使用较低版本,就不要使用它(事实上也没有这样的理由,因为BC只是从5.2开始被破坏的)。但无论版本如何。在数值函数的上下文中返回字符串是错误的。在“div”的情况下返回字符串或数字?类型安全比较,而不在检查类型之前?事实上,不好的想法,因为整个事情都属于“不好的想法”的范畴。我可以让电位除以零,就像你做的那样。否则,我们的两个解决方案以相同的方式解决问题。我的是死板的基础和运行的任何地方。你的需要5.5或笨拙的调用_user_func_array()。实际上,使用PHPYes,而且驾驶任何低于当前车型年款的车辆都很糟糕。事实上,道路上的大多数汽车都不是今年的;大多数PHP主机也不是5.5,现实情况是PHP版本与汽车无关。使用旧版本至少是不安全的。大多数软件也是如此。如果没有理由使用较低版本,就不要使用它(事实上也没有这样的理由,因为BC只是从5.2开始被破坏的)。但无论版本如何。在数值函数的上下文中返回字符串是错误的。