为什么PHP的设计者决定使用句号/句号/“。”作为字符串 连接运算符而不是更通常的加号“+”?
它有什么优势,或者有任何理由吗?或者他们只是喜欢? :O)
答案 0 :(得分:35)
PHP的语法受Perl的影响,而.
是Perl中的字符串连接运算符。
在弱类型语言中,使用不同的字符串连接和数字加法运算符是有好处的:您使用哪一个将影响语言强制变量的类型。
碰巧,Perl 6将使用波浪号~
而不是点.
进行字符串连接,因为.
将用于对象成员访问。所以看来Perl的设计师现在认为这是一个糟糕的选择。
也许,在Perl和PHP的早期,非面向对象的时代,它似乎是一个很好的选择。也许这两种语言的设计者从未设想过他们会成为强大的OO语言。
至于PHP是否有一天会放弃->
成员.
成员访问语法,谁知道呢?
答案 1 :(得分:24)
最明显的原因可能是PHP从Perl继承了很多语法 - 而Perl使用点(.
)进行字符串连接。
但是,我们可以深入研究它并找出为什么在Perl中实现它 - +
运算符最常用于数学方程式 - 它仅用于变量类型可以定义的语言中的串联操作员的工作方式(简单解释,例如C#)
var intAddition = 1 + 2;
Console.WriteLine(intAddition); // Prints 3
var stringConcat = "1" + "2";
Console.WriteLine(stringConcat); // Prints "12"
^如您所见,+
运算符用于C#中的连接和添加。
也许推理水平较低,并且归因于logic gates的布尔代数 - +
在逻辑门中表示OR
,而.
用作{{ 1}}运算符 - 在字符串连接时有意义。
有两个独立的运算符是有意义的,一个用于连接,另一个用于添加 - 不幸的是,由于其他语言,这两个运算符可能会混淆。
答案 2 :(得分:21)
我不是PHP专家,但是,您如何区分最后两行呢?
$first = 100;
$second = 20;
$stringresult = $first . $second; // "10020"
$arithmeticresult = $first + $second; // 120
答案 3 :(得分:13)
逻辑上 + 用于数字。虽然点用于连接段落中的两个句子(字符串),例如。因此,dot用于连接字符串。所以我相信这是合乎逻辑的。这样更好......
答案 4 :(得分:8)
Douglas Crockford thinks that + for Concatenation is a Bad Idea:
JavaScript有一些设计错误,例如+的重载意味着两者兼而有之 与类型强制的加法和连接
答案 5 :(得分:7)
在PHP中使用点作为字符串连接运算符可能追溯到Perl。请记住,PHP曾经只是一堆Perl脚本。
还有不同的字符串连接和加法运算符,特别是在弱类型语言中。 PHP中已经有足够的陷阱可以用脚射击自己,你不需要添加另一个。
答案 6 :(得分:5)
我太喜欢使用句号代替加号,因为我通常将+与数学方程联系起来。
例如"this is a string " + 56 + 20
这对于编译器/解释器和开发人员来说都会非常混乱。
然而,对于连接运算符使用完全停止的缺点是它只是屏幕上的一个点,有时您无法看到它是在字符串中还是在字符串外部。
答案 7 :(得分:5)
这不回答问题,只是想分享一些东西。
来自PHP Manual: String Operators,有人发布了这个我认为相当有趣的内容。注意空间如何在输出中起作用。
<强>摘录:强>
如果您尝试使用连接运算符添加数字,则结果将是这些数字作为字符串的结果。
<?php
echo "thr"."ee"; //prints the string "three"
echo "twe" . "lve"; //prints the string "twelve"
echo 1 . 2; //prints the string "12"
echo 1.2; //prints the number 1.2
echo 1+2; //prints the number 3
?>
答案 8 :(得分:2)
这是一些历史背景。
Perl,以及扩展PHP,具有无类型变量。
"5" == 5
"5" + 5 == 10
"5" . 5 == 55
->
复制了方法访问运算符。.
进行方法访问。.
是可用于此用途的少数几个字符之一。唯一有意义使用的是~
,这可能就是为什么现在是Perl 6连接运算符。答案 9 :(得分:2)
+
应始终定义为可交换操作(即A + B = B + A)。在字符串连接的情况下,情况并非如此(“foo”+“bar”!=“bar”+“foo”)。因此,+
不是用于连接操作的好运算符。语言作者在使用.
时是否考虑到了这一点(与乘法运算符接近的乘法运算符非常接近)仍有待观察,但仍然是一个很好的决定。
答案 10 :(得分:1)
虽然这不是历史原因,但它可能会告诉您为什么在PHP的情况下为加法和连接设置单独的运算符是好的。
原因是我们在JavaScript中看到的。我们也使用+
字符进行连接和添加。在PHP中,我们有两个单独的运算符,这对于动态类型语言非常重要,其中也存在隐式类型转换。
echo 5 + 1; //6
echo 5 . 1; //51
echo "5" + 1; //6
echo "5" . 1; //51
对于任何人来说,这并不令人惊讶,因为我们总是明确声明是否要添加或连接这两个变量。或者换句话说,如果我们将它们视为数字或字符串。
console.log( 5 + 1); //6
console.log("5" + 1); //51
console.log( 5 + "1"); //51
console.log("5" + "1"); //51
如果不知道隐式类型转换是如何发生的,在许多情况下(特别是如果它们很复杂的话)可能会发生令人惊讶的结果,因为我们不知道结果会是什么,因为它不是&#39明确说明。
Python也使用+
运算符进行连接和添加,但它不允许隐式类型转换发生。您必须明确标记类型转换。
print 5 + 1 //6
print "5" + 1 //TypeError: cannot concatenate 'str' and 'int' objects
我们必须进行类型转换才能使其正常工作:a + int(b)
如果我们考虑一下,我们可以看到PHP中发生的几乎相同的事情,我们在Python中看到的,但我们没有明确标记类型转换,而是通过运算符标记我们如何根据类型看到变量。
答案 11 :(得分:0)
我想你可以用字符串连接数字吗?
$i=100;
$str="hello";
$str2 = $str.$i
由于你没有声明变量类型,使用+它可以得到100而不是“hello100”的结果。