在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址。替代的是,引用是符号表别名。注意在PHP 中,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。
PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:
<?php
$a = &$b;
?>
这意味着 $a 和 $b 指向了同一个变量,并不是$a指向$b或者相反。
如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。
<?php
function foo(&$var) { }
foo($a); // $a被创建,并赋值为null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // $b['b']被创建 返回 bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // 在$c中创建d属性 返回 bool(true)
?>
如果在 foreach语句中给一个具有引用的变量赋值,被引用的对象也被改变。
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// 执行操作
}
echo $ref; // 3 - 迭代数组的最后一个元素
?>
引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>
$a 变成 6。这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。
引用做的第三件事是引用返回。
注意在函数调用时没有引用符号——只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了。
以下内容可以通过引用传递:
- 变量,例如 foo($a)
- New 语句,例如 foo(new foobar())
从函数中返回的引用,例如:
<?php
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
?>
任何其它表达式都不能通过引用传递,结果未定义。
引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法:
<?php
class foo {
public $value = 42;
public function &getValue() {
return $this->value;
}
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue 是对$obj->value 的引用,该值为 42.
$obj->value = 2;
echo $myValue; // 打印 $obj->value 赋值,即 2.
?>
当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
<?php
$a = 1;
$b =& $a;
unset($a);
?>
不会unset $b,只是$a.
许多 PHP 的语法结构是通过引用机制实现的,所以上述有关引用绑定的一切也都适用于这些结构。一些结构,例如引用传递和返回,已经在上面提到了。其它使用引用的结构有:
global 引用
当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:
<?php
$var =& $GLOBALS["var"];
?>
unset $var 不会 unset 全局变量。
$this
在一个对象的方法中,$this 永远是调用它的对象的引用。
以上知识点整理于php.net