PHP源码学习——变量与引用

本文深入探讨PHP7的变量与引用,解析底层的zval结构体和写时拷贝机制。通过示例代码,阐述取引用赋值并非如C/C++中的取地址符,而是通过zend_reference实现,且在函数传参和赋值过程中并不能减少内存空间。同时,介绍了PHP的垃圾回收机制和隐式类型转换,强调了数值越界时可能出现的浮点型溢出问题。
摘要由CSDN通过智能技术生成

前言

      《PHP7底层设计与源码实现》一书,内容不多也不少。看完后,对开发中的优化思路有不少启发,其中最多的,便是有关变量方面的认识,也是我个人认为,在日常开发中,最值得多注意多思考的方面。

        在此,个人结合github中最新的php-src,整理一些个人认为应该注意的点以及想法出来,与大家交流。同时,我会对其中的关键结构体在github上php-src源码中的定义的位置标注出来(截止发文时的最新版本)。这一点,是原书中没有标注的,在这里给出,更易于必要时查阅。

请确保具备以下知识基础

  1. 有C/C++基础
  2. 确保了解结构体struct和联合体union的定义和使用(特别是联合体的)
  3. 确保了解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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值