为什么 PHP 字符串串联运算符是点 (.)?[已关闭]

2022-08-30 12:05:30

在 PHP 中,字符串运算符 dot (.) 用于连接字符串。例如:

$msg = "Hello there, " . $yourName;

点运算符似乎总是让人(包括我自己)在第一次看到它时感到困惑,特别是因为当你用它来连接两个字符串时,操作不会抛出错误,而只是“静默地”失败。在PHP和其他语言(如JavaScript,Python等)之间切换时,这也是一个常见的错误,这些语言不使用此运算符。

为什么该语言使用点 (.) 运算符而不是更广泛接受的运算符,例如 plus (+)?对于为什么选择这个运算符,是否有任何历史原因可以指出?仅仅是因为点可以将其他变量类型转换为字符串吗?例如:

echo 1 . 2;                // Prints the string "12"

答案 1

我认为有一个不同的运算符是个好主意,因为点和加号做完全不同的事情。

从非特定语言的角度来看,这实际上意味着什么?"a string" + "another string";

这是否意味着

  • 将两个字符串的数值相加,或者,
  • 连接两个字符串

您会假设它是第二个,但在除字符串之外的所有情况下,加号都用于数字加法。为什么?

另外,从松散类型的角度来看(PHP就是),一个php脚本

$myvar = 1;
$myvar2 = 2;

// would we expect a concatenation or addition?
$concat = $myvar + $myvar2;

因此,点表示法指定它明确用于串联。

这并不是说它令人困惑,而是它不直观,因为所有其他语言都以不同的方式做到这一点。而且,这是追随潮流的好理由吗?以他们总是的方式做事,并不总是正确的方式。


答案 2

加号并不像您想象的连接字符串那样“被广泛接受”。有很多语言不使用它,包括Perl和C,因为这些是PHP的根源所在,所以PHP效仿是有道理的。许多语言甚至没有运算符;你必须使用一个函数。concat()

PHP是弱类型的,当它看到加号或点时,它会进行隐式类型转换。这意味着,如果这样做,PHP 将设置为 。如果使用点串联运算符,则结果显然会大不相同。如果您有 .,则同样适用。这将为您提供 ,但将其更改为加号,您将获得完全不同的结果。$x = "45 inches" + "20 inches";$x65$y = 5 . 10;510

此外,从逻辑上思考,加号的反面是减号。但这并不容易映射到串联。(我见过一种语言尝试过,但它真的没有多大意义)

你对加号作为串联器的偏好纯粹是因为在学习一门新语言时对变化的抵制(这是一件很常见的事情 - 我知道有些人最初讨厌Python,因为它缺乏大括号!

作为一个长期使用多种语言编程的人,我可以告诉你,我更喜欢有一个明确的串联运算符。在松散类型的语言中使用相同的运算符进行加法和串联是自找麻烦;事实上,我会说这是Javascript最大的缺陷之一(这来自一个通常是Javascript粉丝的人)。

Python是stronlytyped的,这意味着它可以使用加号作为加法和串联运算符,因为它迫使你使用相同的类型;你不能在Python中向字符串添加整数;如果需要,则必须显式地强制转换类型,因此没有歧义,至少对编译器没有歧义。

然而,对于读者来说,仍然存在歧义 - 通过阅读代码中任何给定的加号的含义,可能不会立即明显看出。在Python中解决这个问题更容易,但就我个人而言,我仍然希望有一个明确的运算符。但这只是个人喜好。如果我使用Python,Javascript或Visual Basic,那么我必须按照他们的规则工作。


推荐