$s = 'world';echo 'hello ' . $s; // hello worldecho 'hello $s'; // hello $s
从上面大略的例子,可以看到,利用单引号我们须要用.进行拼接,还有在单引号里面传变量的话,它会原样给你,$依然存在,php的阐明器并没有做任何的加工。其余还有,如果想要在单引号中显示单引号或者\,须要利用转义(Escape Sequences),而且单引号中只支持这两种其它转义都不支持,比如\r,\n, 同时,单引号中可以直策应用双引号,双引号中也可以直接显示单引号,这都不须要转义 如下:
echo '\'hello world\''; // 'hello world'echo 'hello \n world'; // hello \n worldecho '\公众hello world\公众'; // \公众hello world\"大众双引号
在利用双引号时,里面的变量可以被求值,
$a = ['foo','bar'];$b = 'world';echo \"大众hello {$b}\"大众; // hello worldecho \"大众hello ${b}\公众; // hello worldecho \公众haha $a[0]\公众; // haha fooecho “hello \n world”; // 可以换行// hello// world
从代码都雅上来看,双引号看起来要简洁很多,尤其是拼接一个长的句子时,如果再夹杂着html,那更是眼花缭乱:
$name = 'Daniel';$city = 'NJ';$age = 18;echo \"大众hello, my name is {$name}, i come from {$city}, i am {$age} years old\"大众;echo 'hello, my name is ' . $name . ', i come from ' . $city . ', i am ' . $age . ' years old';
同时双引号支持更多的转义字符,官网截图如下:
关于双引号和单引号这里贴一个stackoverflow上高赞的回答:
$s = \公众dollars\"大众;echo 'This costs a lot of $s.'; // This costs a lot of $s.echo \"大众This costs a lot of $s.\"大众; // This costs a lot of dollars.更进一步
看完了双引号和单引号的外在表现,我们再来看看它们的opcode,一窥到底。
本操作中利用的是 PHP 7.3.0版本
先来看看单引号:
$s = 'world';echo 'hello ' . $s; // hello world
短短两行代码,看看底层是怎么实现的:
从上面的opcode可以看出,实在很大略,先赋值,然后再拼接输出,末了return,一共实行了4个步骤,同样的操作再来看看双引号:
$s = 'world';echo \"大众hello $s\"大众; // hello world
很明显可以看到,双引号实行了5步,多了NOP这一步,而且原来的CONCAT在这里变成了FAST_CONCAT,这里的NOP便是no operation的缩写,见告打算机不要做任何操作,但是也要摧残浪费蹂躏一个时钟周期,为啥要这么做呢?♂️
StackOverflow上的阐明如下(看了依然不明以是):
还有一个疑问,单引号和双引号分别利用了CONCAT和FAST_CONCAT,这两个都有什么差异?如果就字面意思来看是不是后者比前者更快?如果这样那为什么单引号中不该用FAST_CONCAT?有大佬知道的欢迎留言