目录

引用理解

在 PHP 中引用意味着用不同的名字访问同一个变量内容。

这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址。

引用是符号表别名。

注意:变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。

最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的硬链接hard link。

引用赋值

看一个引用赋值例子:

$a =& $b;

注意:$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方, $a 和 $b 指向了同一个变量容器。

引用传参

看一个引用传参例子:

function foo(&$var)
{
    $num = 1;
    $var =& $num;//这里改变了$var,$var不再作为传参$a的引用别名,而变成了$num的引用别名了,也就和$a无关系了
    // $var = $num;//这里是传值赋值,如果没有上一句$var =& $num,则将改变$var与$a的值,因为$var还是传参$a的引用别名。
    echo $num."\n";
}

$a = 2;
foo($a);
echo $a."\n";

如果是 $var = $num; 则输出:1 1

如果是 $var =& $num; 则输出:1 2

引用返回

不要用返回引用来增加性能,php引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!

要在方法或函数用&指明要返回引用,在调用地方通过&指明获得引用。

...
public $value = 20;
public function &getValue() {
    return $this->value;
}
...

$myValue = &$obj->getValue();//$myValue将绑定类中的属性$value,修改类中的$value值,也就是修改了$myValue


取消引用

$a = 1;
$b =& $a;

unset($a);

由于有一个值同时被$a和$b绑定,所以这里只是解除了$a对这个值的绑定/引用,这个值还有一个引用$b指向值,所以值不会被销毁,只是取消了$a这个引用。如果再unset($b),就再也没有引用指向这个值了,这个时候引用$b取消了,值也同时被销毁了。

如果你对unix系统下的文件硬链接、软链接足够熟悉,就能很好理解了。

Linux硬链接与符号链接之link - 9ong

global其实是引用

global $var 等同于 var $var =& $GLOBALS['var']

所以unset($var),并不会unset全局变量,$GLOBALS[‘var’]仍然存在。

$this是调用他的对象的引用