php的变量以及引用变量的工作原理

1,什么是引用变量?在php当中,用什么符号定义引用变量
在PHP中引用意味着不同的名字访问同一个变量内容;&

详细解析

php引用变量的工作原理
说起来php引用变量,不得不说php的变量。

每个php变量存在一个叫”zval”的变量容器中,一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是”is_ref”,是个bool值,用来标识这个变量是否是属于引用集合;另外一个是”refcount”,用以表示指向这个zval变量容器的变量(也称符号即symbol)个数

想要查看这两个值的话,可以安装一下php的XDEBUG,然后使用xdebug_debug_zval函数,传入变量的参数名字就可以了,如

<?php
$a = array( 'one' );
$b =& $a;
xdebug_debug_zval( 'a' );
?>

打印出来的值是
a:
(refcount=2, is_ref=1)
array (size=1)
0 => (refcount=2, is_ref=0)string ‘one’ (length=3)
unset($b)

class Person
{
    public $name ="zhangsan";
}
$p1 = new Person;
xdebug_debug_zval('p1');
$p2 = $p1;
xdebug_debug_zval('p1');
$p2->name = 'lisi';
xdebug_debug_zval('p1');

打印出来的值是
p1:
(refcount=1, is_ref=0)
object(Person)[1]
public ‘name’ => (refcount=2, is_ref=0)string ‘zhangsan’ (length=8)
p1:
(refcount=2, is_ref=0)
object(Person)[1]
public ‘name’ => (refcount=2, is_ref=0)string ‘zhangsan’ (length=8)
p1:
(refcount=2, is_ref=0)
object(Person)[1]
public ‘name’ => (refcount=0, is_ref=0)string ‘lisi’ (length=4)

说明对象本身就是引用传递。

写出如下程序的输出结果

<?php
$data = ['a','b','c'];
foreach ($data as $key=>$val){
    $val = &$data[$key];
}

程序每一次循环后,$data的值是什么
程序执行完成之后,变量$data的值是什么。

第一次循环,$key=0,$val=a,然后$val=&$data[0],所以$data还是[‘a’,’b’,’c’]
第二次循环比较重要,$key=1,$val=b,这个时候因为是传递引用,所以就改变了$data[0]的值,所以$data就是[‘b’,’b’,’c’]
所以第三次同理就是,所以$data就是[‘b’,’c’,’c’]了。

All posts

Other pages

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注