php的引用(就是在变量或者函数、对象等前面加上&符号) 。
最重要就是 删除引用的变量,只是引用的变量访问不了,但是内容并没有销毁。
在PHP中引用的意思是:不同的名字访问同一个变量内容。
<?php
$a="ABC";
$b =&$a;
echo $a;//这里输出:ABC
echo $b;//这里输出:ABC
$b="EFG";
echo $a;//这里$a的值变为EFG 所以输出EFG echo $b;//这里输出EFG
比如说你想把数组内的数字成2,也可以使用引用的特性。
<?php
$arr = [1,2,3,4];
foreach ($arr as &$value){
$value = $value*2;
}
var_dump($arr);
下面有一道面试题,问输出结果。
<?php
$data = ['a','b','c'];
foreach ($data as $key=>$val){
$val = &$data[$key];
}
var_dump($data);
这是很有意思的一道题,结果是[‘b’,’c’,’c’],循环中进行了隐型复制,不懂得小伙伴继续往下看。
<?php
$data = ['a','b','c'];
foreach ($data as $key=>$val){
xdebug_debug_zval('val');
xdebug_debug_zval('data');
$val = &$data[$key];
xdebug_debug_zval('val');
xdebug_debug_zval('data');
echo '__________________<br/>';
}
var_dump($data);
下面是结果,注意观察 is_ref 的变化
val:
(refcount=2, is_ref=0),string 'a' (length=1)
data:
(refcount=2, is_ref=0),
array (size=3)
0 => (refcount=2, is_ref=0),string 'a' (length=1)
1 => (refcount=1, is_ref=0),string 'b' (length=1)
2 => (refcount=1, is_ref=0),string 'c' (length=1)
val:
(refcount=2, is_ref=1),string 'a' (length=1)
data:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=2, is_ref=1),string 'a' (length=1)
1 => (refcount=2, is_ref=0),string 'b' (length=1)
2 => (refcount=2, is_ref=0),string 'c' (length=1)
__________________
val:
(refcount=2, is_ref=1),string 'b' (length=1)
data:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=2, is_ref=1),string 'b' (length=1)
1 => (refcount=2, is_ref=0),string 'b' (length=1)
2 => (refcount=2, is_ref=0),string 'c' (length=1)
val:
(refcount=2, is_ref=1),string 'b' (length=1)
data:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=1, is_ref=0),string 'b' (length=1)
1 => (refcount=2, is_ref=1),string 'b' (length=1)
2 => (refcount=2, is_ref=0),string 'c' (length=1)
__________________
val:
(refcount=2, is_ref=1),string 'c' (length=1)
data:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=1, is_ref=0),string 'b' (length=1)
1 => (refcount=2, is_ref=1),string 'c' (length=1)
2 => (refcount=2, is_ref=0),string 'c' (length=1)
val:
(refcount=2, is_ref=1),string 'c' (length=1)
data:
(refcount=1, is_ref=0),
array (size=3)
0 => (refcount=1, is_ref=0),string 'b' (length=1)
1 => (refcount=1, is_ref=0),string 'c' (length=1)
2 => (refcount=2, is_ref=1),string 'c' (length=1)
__________________
D:\project\test\closure.php:13:
array (size=3)
0 => string 'b' (length=1)
1 => string 'c' (length=1)
2 => string 'c' (length=1)