字符串和算术运算的 PHP 连接

Posted

技术标签:

【中文标题】字符串和算术运算的 PHP 连接【英文标题】:PHP concatenation of strings and arithmetic operations 【发布时间】:2012-08-13 03:52:12 【问题描述】:

我不久前开始学习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 的弱类型。 【参考方案1】:

发生这种情况是因为串联运算符比加法或减法运算符具有higher precedence,但乘法和除法的优先级高于串联。

所以,你真正在执行的是:

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);

【讨论】:

另一种解决方案是不连接,而是在调用 echo 时使用多个参数。 echo "$a + $b = ", $a + $b; 在我看来,给一半运算符的优先级高于串联,而其中一半的优先级低于串联,这总是不合逻辑的......有谁知道为什么会这样?这只是糟糕的设计还是有原因的??【参考方案2】:

连接优先于加法和减法,但不是乘法或除法。所以

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

等价于

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

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

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

【讨论】:

【参考方案3】:

嗯,你发现了非常奇怪的行为,但是:)

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

虽然添加和提取的优先级较低,但首先评估左侧部分,然后添加/提取到右侧部分。但是 PHP 试图从字符串中提取数值,只有第一个字符是这样的,所以它用它来做。

【讨论】:

以上是关于字符串和算术运算的 PHP 连接的主要内容,如果未能解决你的问题,请参考以下文章

php - 运算符

PHP读书笔记-运算符

web开发基础PHP快速入门-PHP运算符之算术运算符和字符串运算符详解

算术运算符与控制台输入

算术运算符与控制台输入

javascript算术运算符详解