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)

Source: https://www.bigran.cn/article/VX3yWNlo.html

Leave a comment

Published

2019-06-06 17:55:29


Categories


Tags

友情链接

分享代码