如何在PHP变量中存储加号并执行算术运算获得正确结果
问题根源
你代码中存在变量名不统一的问题:定义运算符时用的变量是$с(字符с为西里尔字母),后续代码里调用的是$c(字符c为拉丁字母),二者属于完全不同的变量,$c未被定义默认是空值,所以才会出现两类异常结果:
- 执行
echo $a. $c. $b时,空值的$c不会输出,最终拼接结果就是35 - 执行条件判断时
$c === "+"结果为false,进入else分支执行3 - 5,得到结果-2
解决方案
方案1:修复变量名后用条件分支判断(最安全)
直接修正变量名后用条件判断对应运算符执行运算,无任何注入风险,适合运算逻辑简单的场景:
$a = 3; $b = 5; $c = "+"; // 统一使用拉丁字母c作为变量名 if ($c === "+") { echo $a + $b; // 输出8 } elseif ($c === "-") { echo $a - $b; } elseif ($c === "*") { echo $a * $b; } elseif ($c === "/") { echo $a / $b; }
方案2:运算符映射表(易扩展)
如果需要支持多种运算符,可通过数组映射的方式实现,代码更简洁易维护:
$a = 3; $b = 5; $c = "+"; // 定义运算符和对应处理逻辑的映射 $opMap = [ '+' => fn($x, $y) => $x + $y, '-' => fn($x, $y) => $x - $y, '*' => fn($x, $y) => $x * $y, '/' => fn($x, $y) => $x / $y ]; if (isset($opMap[$c])) { echo $opMap[$c]($a, $b); // 输出8 } else { echo "不支持的运算符"; }
方案3:eval执行(不推荐)
你也可以通过eval函数直接执行拼接后的运算表达式,但该方案存在严重的代码注入风险,仅可在完全确定运算符为安全可控值的场景下使用:
$a = 3; $b = 5; $c = "+"; eval("\$result = $a $c $b;"); echo $result; // 输出8
内容的提问来源于stack exchange,提问作者AndreyKlym
相关产品推荐
相关产品推荐

