PHP:Variable Reference

php引用变量

引用变量概念:意味着使用不同的变量名访问同一个变量内容。

引用变量定义方式:使用&符号。

引用原理

不使用引用:

结果:int(394448) int(394480) int(431400)

使用引用:

结果:int(394448) int(394504) int(394504)

原因:php的COW(Copy Or Write)机制

通过xdebug_debug_zval()查看

不使用引用代码:

结果:
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=2, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
从refcount看出,变量a改变后,refcount变成1,变量a开辟新的空间,即变量a和变量b指向不同的地址.

使用引用代码:

结果:
a: (refcount=1, is_ref=0)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=2, is_ref=1)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
a: (refcount=2, is_ref=1)=array (0 => (refcount=0, is_ref=0)=0, 1 => (refcount=0, is_ref=0)=1)
从refcount看出,变量a改变后,refcount不变,变量a没有开辟新的空间,即变量a和变量b指向同一个地址.a和b的值仍然相同.

unset

unset:unset只是取消引用没有取消地址空间.

结果:
a: (refcount=0, is_ref=0)=1
a: (refcount=2, is_ref=1)=1
a: (refcount=1, is_ref=1)=1
1
a的值仍然存在.

对象本身就是引用传递

结果:
stu1: (refcount=1, is_ref=0)=class Student { public $id = (refcount=0, is_ref=0)=1 }
stu1: (refcount=2, is_ref=0)=class Student { public $id = (refcount=0, is_ref=0)=1 }
stu1: (refcount=2, is_ref=0)=class Student { public $id = (refcount=0, is_ref=0)=2 }

例题

运行结果:
array(3) {
[0] =>
string(1) “a”
[1] =>
string(1) “b”
[2] =>
string(1) “c”
}
array(3) {
[0] =>
string(1) “b”
[1] =>
string(1) “b”
[2] =>
string(1) “c”
}
array(3) {
[0] =>
string(1) “b”
[1] =>
string(1) “c”
[2] =>
string(1) “c”
}
解析:
第一次循环:
$key = 0; $value = ‘a’; $value引用$data[0] = ‘a’;
结果:[‘a’, ‘b’, ‘c’]
第二次循环:
$key = 1; $value = ‘b’; 由于上一次循环中, $value引用$data[0], 所以$data[0]的值发生改变, 变为’b’, 即$data[0]=’b’, 且$value引用$data[1] = ‘b’;
结果:[‘b’, ‘b’, ‘c’]
第三次循环:
$key = 2; $value = ‘c’; 由于上一次循环中, $value引用$data[1], 所以$data[1]的值发生改变, 变为’c’, 即$data[1]=’c’, 且$value引用$data[2] = ‘c’;
结果:[‘b’, ‘c’, ‘c’]

“PHP:Variable Reference”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注