前言
本系列文章主要是根据实战视频《360大牛:全面解读PHP面试》学习过程中记录的学习笔记,期间也会加入查找资料和平时学习中学习到的知识。希望可以鞭策自己不断夯实基础,平时也要查漏补缺。
引用变量概念
在PHP中引用意味着用不同的名字访问同一个变量内容。
定义方式
使用&符号,也就是在变量或者函数、对象等前面加上&符号。
工作原理
<?php
$a = range(0, 1000);
/*
此时,不会为$b额外生成一份内存空间,因为php的COW机制(Copy On Write)。
当$a或$b其中一个变量发生改变时,才会再开辟一份新的内存空间。
COW(copy on write)是内存优化的常见手段,在php中也采用了这种方式来优化内存。
写时复制,即只有当对其中一个或多个变量进行写操作的时候,才会复制一份内存,对其内容进行修改。
*/
$b = $a; //此时均指向同一内存空间
$a = range(0, 1000); //此时$a发生了写操作,会为$a复制一份内存空间,并且对值进行修改
//===============================================================
$a = range(0, 1000);
$b = &$a; //无论何时均指向同一内存空间
$a = range(0, 1000);
面试引申考点
unset
unset()只会取消引用,不会销毁内存空间
<?php
$a = 1;
$b = &$a;
unset($b); //只是把$b对$a的引用取消 http://www.php.net/manual/zh/function.unset.php
echo $a . "\n"; //输出结果 1
对象的复制
在PHP中,对象本身就是引用传递。
<?php
class Person{
public $name = "zs";
}
$p1 = new Person();
$p2 = $p1;
$p2->name = 'ls'; //此时$p1和$p2的$name的值均为 ls 。此为对象的浅复制;若想实现深复制,需要重写__clone()方法
解题方法
针对引用变量的相关考察点,一般使用画图分析法,使用一个小长方形代表一个变量指向的内存,然后分析程序每一步中,变量指向的内存是否发生改变,一边对图修改一边分析。
参考链接:
https://blog.youkuaiyun.com/qq_38253837/article/details/80340505
https://www.cnblogs.com/gengyi/p/6399752.html PHP引用(&)使用详解