为什么要完全停止,“。”而不是加号,“+”,用于PHP中的字符串连接?

时间:2009-12-08 10:35:47

标签: php perl syntax operators concatenation

为什么PHP的设计者决定使用句号/句号/“。”作为字符串 连接运算符而不是更通常的加号“+”?

它有什么优势,或者有任何理由吗?或者他们只是喜欢? :O)

12 个答案:

答案 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)

这是一些历史背景。

  • PHP语言最初是一组Perl脚本。
  • 因此,PHP从Perl中获取了大部分语法。
  • Perl,以及扩展PHP,具有无类型变量。

         "5"  ==   5
    "5" + 5   ==  10
    "5" . 5   ==  55
    
  • 为了能够区分添加和连接,它们必须是两个不同的运算符。
  • Perl从C ->复制了方法访问运算符。
  • 之前许多更现代的编程语言开始使用.进行方法访问。
  • 连接是更常见的操作之一,应该使用更少的字符。据霍夫曼编码。
  • .是可用于此用途的少数几个字符之一。唯一有意义使用的是~,这可能就是为什么现在是Perl 6连接运算符。

答案 9 :(得分:2)

+应始终定义为可交换操作(即A + B = B + A)。在字符串连接的情况下,情况并非如此(“foo”+“bar”!=“bar”+“foo”)。因此,+不是用于连接操作的好运算符。语言作者在使用.时是否考虑到了这一点(与乘法运算符接近的乘法运算符非常接近)仍有待观察,但仍然是一个很好的决定。

答案 10 :(得分:1)

虽然这不是历史原因,但它可能会告诉您为什么在PHP的情况下为加法和连接设置单独的运算符是好的。

原因是我们在JavaScript中看到的。我们也使用+字符进行连接和添加。在PHP中,我们有两个单独的运算符,这对于动态类型语言非常重要,其中也存在隐式类型转换。

在PHP中

echo  5  + 1; //6
echo  5  . 1; //51
echo "5" + 1; //6
echo "5" . 1; //51

对于任何人来说,这并不令人惊讶,因为我们总是明确声明是否要添加或连接这两个变量。或者换句话说,如果我们将它们视为数字或字符串。

在JavaScript中

console.log( 5  +  1);  //6
console.log("5" +  1);  //51
console.log( 5  + "1"); //51
console.log("5" + "1"); //51

如果不知道隐式类型转换是如何发生的,在许多情况下(特别是如果它们很复杂的话)可能会发生令人惊讶的结果,因为我们不知道结果会是什么,因为它不是&#39明确说明。

在Python中

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”的结果。