PHP基础参考11-引用语法
目录
引用理解
在 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系统下的文件硬链接、软链接足够熟悉,就能很好理解了。
global其实是引用
global $var
等同于
var $var =& $GLOBALS['var']
所以unset($var),并不会unset全局变量,$GLOBALS[‘var’]仍然存在。