PHP字符串连接和算术运算

7

我不久前开始学习PHP,遇到了这个问题:

<?php

$a = 1;
$b = 2;

echo "$a * $b  = " . $a * $b;
echo "<br />";

echo "$a / $b  = " . $a / $b;
echo "<br />";

echo "$a + $b  = " . $a + $b;
echo "<br />";

echo "$a - $b  = " . $a - $b;
echo "<br />";

我得到了以下输出:
1 * 2 = 2
1 / 2 = 0.5
3
-1

输出结果中的最后两行并不是我期望的内容。
为什么会这样呢?这些表达式是如何计算的?我想更好地理解这门语言。

作为一般准则,您可能不应该依赖于 PHP 的弱类型。 - Waleed Khan
3个回答

9
这是因为连接运算符的优先级更高,比加减运算符要高,但乘除运算符的优先级比连接还高。
所以,你实际执行的是这个:
echo ("$a + $b  = " . $a) + $b;
echo ("$a - $b  = " . $a) - $b;

在第一个案例中,它会被转换成这样:
"1 + 2 = 1" + $b

PHP会尝试将"1 + 2 = 1"转换为数字(因为type juggling),并得到1,从而将表达式变为:
1 + 2

因此你会得到3。同样的逻辑也可以应用于减法条件。
相反,如果在计算周围加上括号,你将得到期望的输出。
echo "$a + $b  = " . ($a + $b);
echo "$a - $b  = " . ($a - $b);

2
另一个解决方案是不要使用连接符,而是在调用echo时使用多个参数。echo "$a + $b = ", $a + $b; - Robert K
我一直觉得将一半的运算符优先级设置得比连接运算符高,而另一半则低,这种做法非常不合逻辑。有没有人知道为什么会这样呢?这只是糟糕的设计还是有其原因? - user3640967

1

连接优先于加法和减法,但不优先于乘法或除法。因此

echo "$a + $b  = " . $a + $b;

等同于

echo ("$a + $b  = " . $a) + $b;

PHP会忽略第一部分,因为将其转换为数字很困难,只留下+ $b

如果您使用括号,应该没问题。


0

嗯,你发现了非常奇怪的行为,不过 :)

从算术运算符中,除法和乘法具有最高优先级,因此它们在连接之前进行评估。

而加法和提取具有较低的优先级,因此首先评估左部分,然后将其添加/提取到右部分。但是 PHP 尝试从字符串中提取数值,并且只有第一个字符是这样的,所以它使用它进行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接