前言
<?php $arr =\[3,4,5,12,8\]; sort($arr);//对数组排序 var_dump($arr);//打印排序后的数组 $str ="仙士可牛逼!"; $str = mb_substr($str,0,3);//剪切字符串 var_dump($str);
以上代码,分别为数组排序以及字符串截取,它们之间毫无关联,放在一起的主要原因就在于:
sort不会返回处理后的数据,而是直接修改了变量的值,mb_substr 却需要返回值来获取函数处理后的值
大多数情况下,我们封装函数,都是使用的mb_substr的方式,返回处理结果
那么,sort是怎么实现的呢?
php引用
php引用,允许你使用多个变量访问同一部分内容,这个类似于c语言指针,但却不能做指针计算.通常使用&进行声明引用变量,例如:
<?php $a = 1; $b = &$a;//b的值为引用a的数据 $a=2; var_dump($b);//b也变成了2
注意,$b = &$a 的意思不是$b指向了$a,而是$a和$b同时指向了同一内存
<?php function &foo(){ //声明函数将返回一个引用值 return $GLOBALS\['a'\];//返回$GLOBALS\['a'\] } $GLOBALS\['a'\]=1; $a = foo(); //$a = &foo(); $a = 2; var_dump($GLOBALS\['a'\]);
函数返回引用跟变量引用差不多,只是函数引用将返回一个变量,然后在声明时增加引用
php的类引用
在php5之后,php的类将自动返回引用,无需自动调用:
<?php class test{ public $a; public $b; public function __construct($a,$b) { $this->a= $a; $this->b= $b; } } $testa = new test(1,2); //$testa = &new test(1,2); $testb = $testa; $testb->a = 3; $testb->b = 4; var_dump($testa->a,$testa->b);//3,4
当你new一个对象之后,不管赋值多少个变量,所有变量都将指向于同一个对象.
如果你需要复制一个对象不再指向同一个,请使用clone方法进行克隆对象
销毁引用
可回去查看 php的垃圾回收机制
<?php $a = 1; $b = &$a;//引用 $b = 2;//赋值 unset($b);//unset,是引用计数-1,不会影响a的值 var_dump($a);//2
可看出,unset只会删除变量与变量值的关联,但不会真正销毁$a的数据,同理,如果unset($a),$b也不会受到影响
<?php $a = 1; $b = &$a;//引用 $b = 2;//赋值 $b = null;//直接更改内存数据为null,$a,$b都将释放原有内存 var_dump($a);//null var_dump($b);//null
引用使用场景
在文章开头有提到过,sort是使用引用传递变量,直接修改数组数据,达到函数处理效果.
那么我们应该用引用吗?
引用并不会加快程序执行,还可能会使代码可读性降低,但如果你有类似于sort函数,对某些数据需要处理,并且处理前的数据没有任何使用意义时,可以使用引用.
当然,本身php类传递,就已经在用引用方案了,例如 $model->where(['xx'=>'xx']),所以,我们可以放心使用引用,该用就用