搜尋
首頁php教程php手册php引用计数与变量引用

 每个php5.5变量都存储在一个叫做zval的变量容器中。

 

  一个zval变量容器,除了包含变量的类型与值外,还包含两个字节的额外信息:

 

    1、第一个是“is_ref”,是个bool型,用来标识这个变量是否属于引用集合(reference set),若属于则其值为1,否则为0。

 

      有个这个变量php引擎就能够将普通变量与引用变量区分开来。

 

    2、第二个是“refcount”,用来表示指向这个zval变量(符号)的个数。每个符号都有作用域(scope),那些主脚本和函数或者方法也都有作用域。

 

      所有的符号都存在一个符号表中。

 

  当一个变量被赋值一个常量值时,就会生成一个zval变量容器,如下例:

 

    $a = "Hello world";

?>

  这个时候执行以下程序得到$a变量指向zval容器中的is_ref与refcount值

 

    $a = "Hello world";

    print_r(xdebug_debug_zval('a'));

?>

a: (refcount=1, is_ref=0)='Hello world'

  下面,我们进行如下实验,来探讨引用赋值与普通赋值。

 

  首先,使$b指向$a,查看is_ref、 refcount,如下:

 

    $a = "Hello world";  

    $b = $a;

    print_r(xdebug_debug_zval('a'));

    print_r(xdebug_debug_zval('b'));

?>

a: (refcount=2, is_ref=0)='Hello world'

b: (refcount=2, is_ref=0)='Hello world'

  让$b引用$a,查看is_ref    refcount,如下

 

    $a = "Hello world";  

    $b = &$a;

    print_r(xdebug_debug_zval('a'));

    print_r(xdebug_debug_zval('b'));

?>

a: (refcount=2, is_ref=1)='Hello world'

b: (refcount=2, is_ref=1)='Hello world'

  从上我们可以分析出,当有变量引用相应zval容器时,is_ref为1。

 

  我们进一步分析,我们把$b 引用$a,$c指向$a,如下

 

 

<?php
    $a = "Hello world";  
    $b = &$a;
    $c = $a;

    print_r(xdebug_debug_zval(&#39;a&#39;));
    print_r(xdebug_debug_zval(&#39;b&#39;));
    print_r(xdebug_debug_zval(&#39;c&#39;));
?>

 

  打印结果如下

 

a: (refcount=2, is_ref=1)='Hello world'

b: (refcount=2, is_ref=1)='Hello world'

c: (refcount=1, is_ref=0)='Hello world'

  可见,这个时候php5.5引擎为$c重新建立了一个zval容器,容器中的数据类型、值与$a指向的容器中的完全相同,不同的是其refcount与is_ref的值。

 

     因此,我们可以看出,php5.5的zval容器中的is_ref变量要么标识引用集合,要么标识普通集合,当两者都有时,他将克隆zval容器,来解决冲突问题。

 

  

 

  总结:

 

  1、在php5.5以后,“变量赋值”都是指向赋值,即将某个变量指向特定的zval容器。

 

  2、“变量引用”则是将变量与变量进行绑定,若绑定的变量中有一个变量改变了指向,则相互绑定的其他变量的指向也随着改变。

 

    若变量重新引用变量,则其原来的变量绑定解除,转而绑定新的变量。如下代码:

 

  

<?php
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar);
?>

 

  这将使 foo 函数中的 $var 变量在函数调用时和 $bar 绑定在一起,但接着又被重新绑定到了 $GLOBALS["baz"] 上面。不可能通过引用机制将 $bar 在函数调用范围内绑定到别的变量上面,因为在函数 foo 中并没有变量$bar(它被表示为 $var,但是 $var 只有变量内容而没有调用符号表中的名字到值的绑定)。可以使用引用返回来引用被函数选择的变量。

 

 



陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具