PHP引用(&)以及底层实现原理

面试题NO.1 什么是引用变量?在PHP中引用是如何实现的。
概念:
引用:在PHP中,不同的变量名字访问同一个变量的内容,成为引用,用&符号表示。

引用工作原理:

(1)PHP在内存中存储的原理:


    $a = range(1, 100);
    $b = $a;
?>

因为PHP中存在COW(Copy On Write)机制,所以 b b 变 量 不 会 再 开 辟 一 个 空 间 , 只 会 指 向 a;
以上代码在内存中可表示为下图:
PHP引用(&)以及底层实现原理_第1张图片

只有当对 a a 进 行 写 操 作 才 会 改 变 a的存储,此时会重新开辟一个空间;这就是PHP的COW机制。即:


    $a = range(1, 100);
    $b = $a;
    $a = range(1, 100);
?>

这样虽然没有改变 a a 的 值 , 但 是 会 在 内 存 中 重 新 开 辟 一 个 空 间 用 于 存 储 a。可以用PHP函数 memory_get_usage() 查看内存使用情况用以证明。

(2)PHP中引用的实现原理


    $a = range(1, 100);
    $b = &$a;
?>

此时因为有引用(&),则在内存中 a a 的 地 址 将 永 远 指 向 a最开始分配的内存,并且是不会改变的,此时
PHP引用(&)以及底层实现原理_第2张图片

然后如果此时改变$a的值:


    $a = range(1, 100);
    memory_get_usage();
    $b = &$a;
    memory_get_usage();
    $a = range(1,1000);
    memory_get_usage();
?>

PHP引用(&)以及底层实现原理_第3张图片
可以看到内存中不会重新开辟一块空间,因为引用是将这块地址永远的分配给了 a a 和 b,所以改变 a a 的 值 也 会 对 应 改 变 这 块 地 址 上 存 储 的 值 , a和$b的值都会改变。也可用memory_get_usage()函数进行查看。

(3)PHP中的zval结构体(变量容器)

我们知道PHP中的变量都是存储在zval结构体中的,引用也可以通过查看zval结构体中的存储情况去查看。


    $a = range(1, 100);
    xdebug_debug_zval('a');
    $b = &$a;
?>

在使用xdebug_debug_zval();函数需要安装PHP的xdebug扩展。

你可能感兴趣的:(php)