为什么php字符串连接运算符是一个点(.)?

Jus*_*ier 38 php string-concatenation operators

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

$msg = "Hello there, " . $yourName;
Run Code Online (Sandbox Code Playgroud)

点运算符似乎总是在他们第一次看到它时混淆了人(包括我自己),特别是当你用它来连接2个字符串时,操作不会抛出错误而只是"默默地"失败.在PHP和其他不使用此运算符的语言(如JavaScript,Python等)之间切换时,这也是一个常见的错误.

我的问题是,为什么语言使用点(.)运算符而不是更广泛接受的运算符,如加号(+)?您是否有任何历史原因可以指出选择此运算符的原因?是因为点可以将其他变量类型转换为字符串吗?例如:

echo 1 . 2;                //prints the string "12"
Run Code Online (Sandbox Code Playgroud)

谢谢!

Cod*_*nci 29

我认为这是有一个不同的运营商是个好主意,因为点和加做完全不同的事情.

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

这是不是意味着

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

你会认为它是第二个,但除了字符串之外的所有情况都使用加号进行数字加法.为什么?

此外,从松散的类型(PHP是),一个PHP脚本

$myvar = 1;
$myvar2 = 2;

// would we expect a concatenation or addition?
$concat = $myvar + $myvar2;
Run Code Online (Sandbox Code Playgroud)

点符号因此指定它明确用于连接.

这并不是令人困惑,而是它不直观,因为所有其他语言都以不同的方式进行.而且,这是跟随潮流的一个很好的理由吗?以他们总是这样做的方式做事并不总是正确的方式.

  • *为什么*它"只是令人困惑"?你上面的评论似乎只是个人对'+'操作符的偏好(我怀疑它来自你使用它的其他语言的经验?). (11认同)
  • 我很欣赏你的逻辑原因,但我完全不同意.这个点只是令人困惑,也是我真正讨厌PHP的少数事情之一. (5认同)
  • 我认为这至少有点让人感到困惑.2`不等于`1.2`.有数学背景的人可能会认为`$ x.$ y`表示`$ x`乘以`$ y`.(但显然任何开始使用新语言编写代码的人都应该学习该语言的基本操作符.) (5认同)
  • 这个论点是有效的,但前提是错误的.由于其弱类型系统,PHP创建了点运算符解决的模糊性.它是更严格的变量类型和更严格的操作参数类型之间的权衡:在JavaScript中,"+"通常是明确的,因为您希望在使用之前将用户输入转换为正确的类型; 在PHP中,"+"需要强制执行其参数类型(即将其参数自动转换为数字),因为您希望能够将用户输入作为字符串传递.这就是为什么这么多人认为PHP很草率的部分原因. (3认同)

Spu*_*ley 10

加号并不像你想象的那样被"广泛接受"用于连接字符串.这里有很多的不使用它,包括Perl和C语言,并且因为这些是在其中PHP的根源在于,它是有道理的PHP跟风.许多语言甚至都没有操作员; 你必须使用一个concat()功能.

PHP是弱类型的,当它看到加号或点时会进行隐式类型转换.这意味着如果你这样做$x = "45 inches" + "20 inches";,PHP将设置$x65.如果使用点连接运算符,结果将明显不同.如果你有,同样适用$y = 5 . 10;.这会给你510,但改为加号,你得到一个完全不同的结果.

另外,从逻辑上思考,加号的反面是减号.但这并没有如此容易地映射到连接.(我已经看过一种试过它的语言,但它真的没什么意义)

你对加号作为连接符的偏好完全取决于在学习一门新语言时对变化的抵制(这很常见 - 我知道有些人最初讨厌Python,因为它没有花括号!)

作为使用大量语言编程了很长时间的人,我可以告诉你,我更喜欢有一个明确的连接运算符.使用相同的运算符以松散类型的语言进行添加和连接是一种麻烦; 事实上,我会说这是Javascript最大的缺陷之一(而且这来自于一般都是Javascript粉丝的人).

Python是stronly-typed,这意味着它可以使用加号作为加法和连接运算符,因为它会强制你使用相同的类型; 你不能在Python中为字符串添加整数; 如果你需要那么你必须明确地转换你的类型,所以没有歧义,至少不是编译器.

然而,读者仍然存在歧义 - 通过阅读代码中任何给定加号的含义,可能不会立即显而易见.Python中更容易实现它,但我个人仍然希望有一个明确的运算符.但这只是个人偏好; 如果我正在使用Python,Javascript或Visual Basic,那么我必须遵守他们的规则.

  • `C`语言不使用`+`运算符,因为它根本没有字符串连接运算符!只能在'C类重载运营商+`,我还记得,当性学习的'C++,我做了第一次的事情之一`是`MyString`类用来连接字符串'+'操作.这很酷! (7认同)

Ros*_*ron 6

由于数字和数字字符串之间的等价性,因此无法在PHP中使用+作为连接运算符.你有两个运算符使用相同的符号,结果"3" + 3必须是未定义的.现在,"3" + 36,"3" . 3"33".

  • _""3"+ 3必须是未定义的."_ - 它不会被定义为未定义,它可以像许多其他语言一样转换为字符串而不会破坏时间和空间的结构. (4认同)