Press "Enter" to skip to content

PHP变量存储在zval容器中

PHP 变量存储在称为“zval”的容器中。zval 容器除了变量的类型和值之外,还包含两个额外的信息位。第一个是“is_ref”,是布尔值,表示变量是否是“引用集合”的一部分。通过这个位,PHP 引擎知道如何区分普通变量和引用。由于 PHP 允许用户自定义引用,通过 & 运算符创建引用,zval 容器还有内部引用计数机制来优化内存使用。第二个是“refcount”,表示有多少个变量名(也称为符号)指向这个 zval 容器。所有符号都存储在一个符号表中,每个作用域都有一个符号表。主脚本(即通过浏览器请求的脚本)有一个作用域,每个函数或方法也有一个作用域。

当使用常量值创建新变量时,也会创建 zval 容器,例如

示例 #1 创建新 zval 容器<?php
$a = "new string";
?>

在这种情况下,新的符号名称 a 会在当前作用域中创建,并且会创建新的变量容器,其类型为 string,值为 new string。由于没有创建用户定义的引用,“is_ref”位默认设置为 false。“refcount”设置为 1,因为只有一个符号使用了这个变量容器。请注意,具有“refcount”为 1 的引用(即”is_ref”为 true)会视为非引用(即“is_ref”为 false)。如果安装了 » Xdebug,可以通过调用 xdebug_debug_zval() 来显示此信息。

示例 #2 显示 zval 信息<?php
$a = "new string";
xdebug_debug_zval('a');
?>

以上示例会输出:

a: (refcount=1, is_ref=0)='new string'
https://www.php.net/manual/zh/features.gc.refcounting-basics.php
发表评论