前言
《PHP7底层设计与源码实现》一书,内容不多也不少。看完后,对开发中的优化思路有不少启发,其中最多的,便是有关变量方面的认识,也是我个人认为,在日常开发中,最值得多注意多思考的方面。
在此,个人结合github中最新的php-src,整理一些个人认为应该注意的点以及想法出来,与大家交流。同时,我会对其中的关键结构体在github上php-src源码中的定义的位置标注出来(截止发文时的最新版本)。这一点,是原书中没有标注的,在这里给出,更易于必要时查阅。
请确保具备以下知识基础
- 有C/C++基础
- 确保了解结构体struct和联合体union的定义和使用(特别是联合体的)
- 确保了解C/C++的取地址符&
正文
很多同学应该都晓得php的写时拷贝这个点,但是我还是选择对这方面深入探讨,是因为我发现日常工作中,还是个人与其他同学理依然容易混淆php7与php5的拷贝机制,且网上大多数文章脱离了php源码仅对结论做列举和验证。因此,在这里,我结合github中的源码对该部分做知识梳理。
一个问题
我们先来做个赋值,并获取赋值前后的内存占用,以此抛出我们后续要讨论的问题。
$a = str_repeat('hello', 1);
$before = memory_get_usage();
$b = $a;
echo 'after: ' . (memory_get_usage() - $before); // 输出 after: 0
接下来,仅在第三行增加引用符号
$a = str_repeat('hello', 1);
$before = memory_get_usage();
$b = &$a; // 仅在这里增加取引用符
echo 'after: ' . (memory_get_usage() - $before); // 输出 after: 24
由此,我们可以得到一个简单的结论:取引用符不能帮助我们节省内存空间,反而会增加内存空间使用。学过C\C++的同学,可能会对此比较懵逼(实际上,我并不止一次听到用同学认为『&』与C/C++中的取地址符等效)
接下来,我们带着这点疑问,继续深入探讨,自然就明白了。
引用
先来看一段代码和原理图。
示例代码与原理图
$a = 10;
$b = $a;