这意味着 $a 和 $b 指向了同一个变量。 Note: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。 Note: 如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。 Note: 如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。 Example #1 对未定义的变量使用引用 复制代码 代码如下: <?php function foo(&$var) { } foo($a); // $a is "created" and assigned to null $b = array(); foo($b["b"]); var_dump(array_key_exists("b", $b)); // bool(true) $c = new StdClass; foo($c->d); var_dump(property_exists($c, "d")); // bool(true) ?>
同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本): 复制代码 代码如下: <?php $bar =& new fooclass(); $foo =& find_var($bar); ?>
自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。 Note: 不用 & 运算符导致对象生成了一个拷贝。如果在类中用 $this,它将作用于该类当前的实例。没有用 & 的赋值将拷贝这个实例(例如对象)并且 $this 将作用于这个拷贝上,这并不总是想要的结果。由于性能和内存消耗的问题,通常只想工作在一个实例上面。 尽管可以用 @ 运算符来抑制构造函数中的任何错误信息,例如用 @new,但用 &new 语句时这不起效果。这是 Zend 引擎的一个限制并且会导致一个解析错误。 Warning 如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。 Example #2 在函数内引用全局变量 复制代码 代码如下: <?php $var1 = "Example variable"; $var2 = ""; function global_references($use_globals) { global $var1, $var2; if (!$use_globals) { $var2 =& $var1; // visible only inside the function } else { $GLOBALS["var2"] =& $var1; // visible also in global context } } global_references(false); echo "var2 is set to "$var2"
"; // var2 is set to "" global_references(true); echo "var2 is set to "$var2"
"; // var2 is set to "Example variable" ?>
把 global $var; 当成是 $var =& $GLOBALS["var"]; 的简写。从而将其它引用赋给 $var 只改变了本地变量的引用。 Note: 如果在 foreach 语句中给一个具有引用的变量赋值,被引用的对象也被改变。 Example #3 引用与 foreach 语句 复制代码 代码如下: <?php $ref = 0; $row =& $ref; foreach (array(1, 2, 3) as $row) { // do something } echo $ref; // 3 - last element of the iterated array ?>
这些条件是 PHP 4.0.4 以及以后版本有的。 引用返回 引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法: 复制代码 代码如下: <?php class foo { public $value = 42; public function &getValue() { return $this->value; } } $obj = new foo; $myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42. $obj->value = 2; echo $myValue; // prints the new value of $obj->value, i.e. 2. ?>