# 引用传递

在 PHP 中,COW(Copy-On-Write)机制是一种优化技术,用于延迟或完全避免数据的复制,直到数据需要修改为止。COW 机制的优点在于它可以减少不必要的内存分配和数据复制,从而提高代码的性能。

<?php
    // 初始 4962896
    dump(memory_get_usage());

    // 声明变量 a
    $a = range(1, 1000);

    // 声明变量之后 5044328 - 4962896 = 81432
    dump(memory_get_usage());

    $b = $a;

    // 变量 a 赋值给变量 b 之后 5045936 - 5044328 = 1608
    dump(memory_get_usage());

    $a = range(1, 1000);

    // 变量 a 重写,触发 cow 机制 5084464 - 5045936 = 38528
    dump(memory_get_usage());

变量赋值到变量 a 重写的过程,内存使用过程如下:

PHP 是一种广泛使用的服务器端脚本语言,用于开发动态网页和 Web 应用程序。Zend 引擎是 PHP 的核心引擎,负责解析和执行 PHP 代码。它包含了大量的内置函数和类,提供了内存管理、垃圾回收、变量处理等功能,是 PHP 语言运行的关键部分。Zval 数据结构是 Zend 引擎中用于表示变量的内部数据结构。它是一个复合类型,包含了变量的类型、值和引用计数等信息。

下面我们看一下上面的流程,变量 a 的 zval 数据结构。

<?php

    $a = range(1, 3);

    xdebug_debug_zval('a');

    $b = $a;

    xdebug_debug_zval('a');

    $a = range(1, 3);

    xdebug_debug_zval('a');

下图展示了从声明变量 a ,再赋值给变量 b ,变量 a 再重写的过程中,变量 a 的数据结构情况。

我们再试引用赋值的情况,与直接赋值进行对比:

<?php

    $a = range(1, 3);

    xdebug_debug_zval('a');

    $b = &$a;

    xdebug_debug_zval('a');

    $a = range(1, 3);

    xdebug_debug_zval('a');

# 取消引用

当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。

思考题:问如下的每一步的结果是什么或最终结果是什么?

<?php

    $arr = ['a', 'b', 'c'];

    foreach ($arr as $key => $val) {
        $val = &$arr[$key];
    }