当前位置:首页 > 技术分析 > 正文内容

谈谈PHP中的单引号和双引号

ruisui882个月前 (04-26)技术分析16

我们在做字符串拼接的时候,有多种方式,最常用的莫过于使用单引号和双引号拼接了,当让sprintf()也用的比较多,但每次在使用单引号和双引号时,总会纠结使用哪一种方式,不知道你们有没有纠结过,所以今天来仔细研究下。

单引号

我们先来看个单引号的例子:

$s = 'world';
echo 'hello ' . $s; // hello world
echo 'hello $s'; // hello $s

从上面简单的例子,可以看到,使用单引号我们需要用.进行拼接,还有在单引号里面传变量的话,它会原样给你,$依然存在,php的解释器并没有做任何的加工。另外还有,如果想要在单引号中显示单引号或者\,需要使用转义(Escape Sequences),而且单引号中只支持这两种其它转义都不支持,比如\r,\n, 同时,单引号中可以直接使用双引号,双引号中也可以直接显示单引号,这都不需要转义 如下:

echo '\'hello world\''; // 'hello world'
echo 'hello \n world'; // hello \n world
echo '"hello world"'; // "hello world"

双引号

在使用双引号时,里面的变量可以被求值,

$a = ['foo','bar'];
$b = 'world';
echo "hello {$b}"; // hello world
echo "hello ${b}"; // hello world
echo "haha $a[0]"; // haha foo
echo “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?有大佬知道的欢迎留言

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3608.html

分享给朋友:

“谈谈PHP中的单引号和双引号” 的相关文章

Vue组件通信之props深入详解!

props 是 Vue 组件中一个很重要的概念。它是用来从父组件向子组件传递数据的。为什么需要props?这是因为在Vue中,组件是相互隔离的。每个组件都有自己的作用域,子组件无法直接访问父组件的状态或值。通过props,父组件可以将数据传递给子组件。使用props的步骤:1. 在子组件中定义pro...

Git 分支管理策略汇总

最近,团队新入职了一些小伙伴,在开发过程中,他们问我 Git 分支是如何管理的,以及应该怎么提交代码?我大概说了一些规则,但仔细想来,好像也并没有形成一个清晰规范的流程。所以查了一些资料,总结出下面这篇文章,一共包含四种常见的分支管理策略,分享给大家。Git flow在这种模式下,主要维护了两类分支...

程序员开发必会之git常用命令,git配置、拉取、提交、分支管理

整理日常开发过程中经常使用的git命令![送心]git配置SSH刚进入项目开发中,我们首先需要配置git的config、配置SSH方式拉取代码,以后就免输入账号密码了!# 按顺序执行 git config --global user.name "自己的账号" git config -...

使用cgroup限制进程资源

这里使用containerd项目中的cgroup包来实现进程资源限制。先写一个耗费一个CPU并且一秒增加10m内存的测试进程package mainimport ( "fmt" "math/rand" "time")func main() { go f...

Solid State Logic 发布低保真数字失真插件 Digicrush

Solid State Logic 宣布推出低保真数字失真插件 Digicrush ,他们最新的创意工具具有经典数字失真的粗糙、低保真特性,完美模拟早期数字音频的衰减和伪影。Digicrush 充满怀旧气息,深受经典数字采样器和效果器的影响,具有内置抖动、可调比特深度和采样率降低功能,是为音轨添加复...

全新斯柯达柯珞克Karoq深度评测:大众替代品

“斯柯达柯珞克是一款出色的全能家庭 SUV,具有许多有用的功能”价格36,605 英镑- 49,190 英镑优点方便的 VarioFlex 后排座椅非常适合家庭入住驾驶乐趣缺点保修期短保守的内饰性格比Yeti少结论——斯柯达柯珞克是一辆好车吗?斯柯达柯珞克是在辉煌的七座 斯柯达柯迪亚克之后推出的,因...