您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
2-2 PHP引用变量考察点(下)
发布时间:2020-10-02 10:10:45编辑:雪饮阅读()
Unset
对于unset的使用大家应该是不陌生,可是鲜有人知的是unset仅仅只是取消引用,而不销毁空间。如:
<?php
function myDump($val){
echo "<pre>";
print_r($val);
echo "</pre>";
}
$a=1;
$b=&$a;
unset($b);
myDump($a);
运行结果:
1
再谈COW
昨天有聊过COW机制,对于不同对象的完全覆盖仍旧是生效的,那么对于同一对象赋值于两个变量,其中一个变量修改了该对象的某属性,又该如何?如:
<?php
function myDump($val){
echo "<pre>";
print_r($val);
echo "</pre>";
}
class Person{
public $name='zhangsan';
}
$p1=new Person();
myDump(xdebug_debug_zval('p1'));
$p2=$p1;
myDump(xdebug_debug_zval('p1'));
$p2->name='lisi';
myDump(xdebug_debug_zval('p1'));
运行结果:
p1: (refcount=1, is_ref=0)=class Person { public $name = (refcount=1, is_ref=0)='zhangsan' }
p1: (refcount=2, is_ref=0)=class Person { public $name = (refcount=1, is_ref=0)='zhangsan' }
p1: (refcount=2, is_ref=0)=class Person { public $name = (refcount=1, is_ref=0)='lisi' }
从运行结果不难得出在这种情况下另外一个变量的对象的属性同样会变,那么为什么会这样呢?这里是因为对象本身就是引用传递类型,则拥有引用的特性。
关于引用在foreach的一个经典面试题
首先我们需要拆解该程序,首先每次foreach在as的过程中就会有$k=0,1…$v=a,b…
然后$v=&$d[0,1…],也就是说每次循环都会执行这三条语句。那么我们拆解得:
$k=0;
$v=a;
$v=&$d[0];//$v第一次引用
$k=1;
$v=b;//则此时改变了上面&$d[0]的值
$v=&$d[1];//$v第二次引用
$k=2;
$v=c;//则此时改变了上面&$d[1]的值
$v=&$d[2];//$v第三次引用
所以我们不难得出d的最终结果是bcc
那么其对应的内存空间示意图如:
那么题目中有问道每次循环的结果是什么以及最后的结果是什么,那么对于我们推导的验证如:
<?php
function myDump($val){
echo "<pre>";
print_r($val);
echo "</pre>";
}
$data=['a','b','c'];
foreach($data as $key=>$val){
$val=&$data[$key];
myDump($data);
}
myDump($data);
其运行结果如:
Array
(
[0] => a
[1] => b
[2] => c
)
Array
(
[0] => b
[1] => b
[2] => c
)
Array
(
[0] => b
[1] => c
[2] => c
)
Array
(
[0] => b
[1] => c
[2] => c
)
关键字词:unset,php,COW,引用,foreach
下一篇:2-3 常量及数据类型考察点