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

2021/01/10 21:21 · php ·  · 0评论

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

它有什么优势,还是有任何理由?还是他们只是喜欢?:o)

最明显的原因可能是PHP从Perl继承了很多语法-Perl使用点(.)进行字符串连接。

但是,我们可以更深入地研究它,并弄清楚为什么在Perl中实现了这一点-+运算符最常用于数学方程式-仅用于以变量类型可以定义运算符工作方式的语言进行级联(简单的解释,例子是C#)

var intAddition = 1 + 2;
Console.WriteLine(intAddition); // Prints 3
var stringConcat = "1" + "2";
Console.WriteLine(stringConcat); // Prints "12"

^如您所见,+运算符在C#中既用于连接又用于加法。


也许推理变为较低的水平,并且由于布尔代数逻辑门-+装置OR中的逻辑门,而.被用作AND操作员-这是有意义的,当涉及到字符串连接。

拥有两个单独的运算符是有意义的,一个运算符用于连接,一个运算符用于加法-不幸的是,由于其他语言,这两个运算符可以混合在一起。

PHP的语法受Perl的影响,并且.Perl中的字符串连接运算符。

在弱类型语言中,使用不同的字符串连接运算符和数字加法运算符有很多优点:使用哪种运算符会影响该语言将变量强制转换为哪种类型。

碰巧的是,Perl 6将使用波浪号~而不是点.来进行字符串连接,因为.它将用于对象成员访问。因此,似乎Perl的设计师现在认为这是一个错误的选择。

也许在Perl和PHP的早期非面向对象的时代,它似乎是一个很好的选择。也许这两种语言的设计者从未设想过它们会成为强大的面向对象语言。

至于PHP是否有一天会放弃其->成员访问语法.,谁知道呢?

我不是PHP专家,但是,您如何区分最后两行呢?

$first  = 100;
$second = 20;
$stringresult     = $first . $second; // "10020"
$arithmeticresult = $first + $second; // 120

逻辑上+用于数字。例如,一个用于连接段落中的两个句子(字符串)。因此,点用于连接字符串。因此,我相信这是合乎逻辑的。这样更好...

道格拉斯·克罗克福德(Douglas Crockford)认为+对于串联是个坏主意

JavaScript有其设计错误,例如+的重载表示类型强制的加法和串联。

在PHP中将点用作字符串连接运算符的历史可能可以追溯到Perl。请记住,PHP曾经只是一堆Perl脚本。

另外,具有独特的字符串连接和加法运算符也很有意义,尤其是在弱类型语言中。PHP已经有足够的陷阱让您无所适从,您无需添加其他陷阱。

我也更喜欢使用句号而不是加号,因为我通常将+与数学方程式关联。

例如 "this is a string " + 56 + 20

这对于编译器/解释器和开发人员都非常混乱。

但是,对连接运算符使用句号的缺点是它只是屏幕上的一个点,有时您看不到它是在字符串中还是在字符串外。

这不能回答问题,只是想分享一些东西。

PHP手册:字符串运算符中,有人发布了这个,我觉得很有趣。注意空间如何在输出中发挥作用。

摘录:

如果尝试使用连接运算符添加数字,则结果将是这些数字作为字符串的结果。

<?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

?>

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

这是一些历史背景。

  • PHP语言开始时是一组Perl脚本。
  • 因此,PHP从Perl中获得了大部分语法。
  • Perl(通过扩展PHP)具有未类型化的变量。

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

尽管这不是历史原因,但它可能向您显示了为什么在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

如果不知道隐式类型转换是如何发生的,那么在许多情况下(尤其是如果它们很复杂),可能会发生令人惊讶的结果,因为我们不知道结果将是什么,因为没有明确说明。

在Python中

Python还使用+运算符进行串联和加法运算,但它不允许隐式类型转换发生。您必须显式标记类型转换。

print  5  + 1 //6
print "5" + 1 //TypeError: cannot concatenate 'str' and 'int' objects

我们必须进行类型转换才能使其工作: a + int(b)

总而言之

如果我们考虑一下,我们可以看到在PHP中几乎发生了与在Python中相同的事情,但是与显式标记类型转换相反,我们用运算符标记了如何在类型方面看待变量。

我想是这样,您可以将数字和字符串连接起来吗?

$i=100;
$str="hello";
$str2 = $str.$i

由于您没有声明变量类型,因此使用+号可以得到100而不是“ hello100”的结果。

本文地址:http://php.askforanswer.com/weishenmeyaoyongjuhao-erbushiyongyuphpzhongzifuchuanlianjiedejiahao.html
文章标签: ,   ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!