有引用,但不与指针相同。
php.net 有多个页面解释What References Are、What References Do 和What References Are Not。
那里也被多次提及
引用不是指针。
它们提供了一种将$a 分配给$b 的方法,因此如果您重新分配$b,$a 也会发生变化:
$a = 'a';
$b = &$a; // Reference
$b = 'b'; // Now $a == 'b'
这也可以用于函数参数:
function myFunc(&$b)
{
$b = 'b';
}
$a = 'a';
myFunc($a); // Now $a == 'b'
在 PHP 5.3.0 之前也可以做一个叫做“调用时传递引用”的事情,你可以有一个“正常”的函数声明并在调用中使用 & 运算符:
function myFunc($b)
{
$b = 'b';
}
$a = 'a';
myFunc(&$a); // As of PHP 5.3.0 produces a Fatal Error, saying:
// Call-time pass-by-reference has been removed; If you would like to pass argument by reference, modify the declaration of myFunc().
但要小心!分配另一个引用不会更新原始引用:
$a = 'a';
$b = 'b';
$c = &$a;
$c = &$b; // $a == 'a'
[Demo]
由此产生的陷阱存在于 global 关键字中。
$a = 'a';
$b = 'b';
function myFunc()
{
global $a, $b;
$a = &$b;
var_dump($a);
}
myFunc(); // 'b'
var_dump($a); // 'a'
这是因为global $a 实际上意味着$a = &$GLOBALS['a'],因此为其分配新引用不会更新$GLOBALS。
当然,您可以直接使用$GLOBALS 来防止这种情况发生。
但是,如果您完全使用全局变量,那么无论如何您都应该重新考虑您的设计。
有了引用,现在设置变量 = NULL 和使用 unset() 之间也有区别。
= NULL 遵循引用,unset() 没有:
$a = 'a';
$b = &$a;
unset($b); // $a == 'a'
$a = 'a';
$b = &$a;
$b = NULL; // $a == NULL
[Demo]
底线:
引用允许没有它们就不可能实现的事情,但有时由于 PHP 的构建方式,它们的行为方式与人们期望的不同。