深入PHP变量存储的详解(2)


<?php
$a = 1;
$b = $a;
$c = $b;
$d = &$c; // 在一堆非引用赋值中,插入一个引用
?>


这段代码首先进行了一次初始化,这将创建一个新的zval,is_ref=0, refcount=1,并将a指向这个zval;之后是两次非引用赋值,正如前面所说,只要把b和c都指向a的zval即可;最后一行是个引用赋值,需要is_ref为1,但是Zend发现c指向的zval并不是引用型的,于是为c创建单独的zval,并同时将d指向该zval。
从本质上来说,这也可以看作是一种Copy-On-Write,不仅仅是value,is_ref也是受保护的对象。
整个过程图示如下:

深入PHP变量存储的详解

情况II,看如下PHP代码:

复制代码 代码如下:


<?php
$a = 1;
$b = &$a;
$c = &$b;
$d = $c; // 在一堆引用赋值中,插入一个非引用
?>


这段代码的前三句将把a、b和c指向一个zval,其is_ref=1, refcount=3;第四句是个非引用赋值,通常情况下只需要增加引用计数即可,然而目标zval属于引用变量,单纯的增加引用计数显然是错误的, Zend的解决办法是为d单独生成一份zval副本。
全过程如下所示:

深入PHP变量存储的详解

1.1.5 参数传递
PHP函数参数的传递和变量赋值是一样的,非引用传递相当于非引用赋值,引用传递相当于引用赋值,并且也有可能会导致执行zval状态切换。这在后面还将提到。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/c8ff67c95909036bd14f1f0b2c035545.html