PHP的引用
天下维客,你可以修改的网络知识库
| PHP的引用 | PHP的引用传递 | PHP的引用返回 | PHP的引用定位 | 取消PHP引用 |
在PHP中,引用意味着:用不同的名字访问同一个变量内容。
这并不像C语言的指针,替代的是,引用是符号表别名。注意在PHP中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是Unix的文件名和文件本身――变量名是目录条目,而变量内容则是文件本身。引用可以被看作是Unix文件系统中的hardlink。
PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:
<?php $a =& $b; ?>
这意味着 $a 和 $b 这两个变量名,实际指向了同一个变量。
注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。
注: 如果具有引用的数组被拷贝,其值不会解除引用。对于数组传值给函数也是如此。
引用做什么
引用可以用于:
- 为复杂变量建立别名,以便简化书写
- 例如
... $temp=& $object ->$x -> $y -> $z; $other = $temp; //等效于 $other = $object -> $x ->$y -> $z; $temp = "something"; //等效于 $object -> $x ->$y -> $z = "something"; ...
- 用于函数的参数传递
- 用引用方式传递参数稍快于普通的传值方式
- 用于函数的返回值传递
同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本):
<?php $bar =& new fooclass(); $foo =& find_var($bar); ?>
注: 不用 & 运算符导致对象生成了一个拷贝。如果在类中用 $this,它将作用于该类当前的实例。没有用 & 的赋值将拷贝这个实例(例如对象)并且 $this 将作用于这个拷贝上,这并不总是想要的结果。由于性能和内存消耗的问题,通常只想工作在一个实例上面。
尽管可以用 @ 运算符来抑制构造函数中的任何错误信息,例如用 @new,但用 &new 语句时这不起效果。这是 Zend 引擎的一个限制并且会导致一个解析错误。
警告
如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见。可以通过使用 $GLOBALS 数组避免这一点。
例子 21-1. 在函数内引用全局变量
<?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'\n"; // var2 is set to '' global_references(true); echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable' ?>
把 global $var; 当成是 $var =& $GLOBALS['var']; 的简写。从而将其它引用赋给 $var 只改变了本地变量的引用。
注: 如果在 foreach 语句中给一个具有引用的变量赋值,被引用的对象也被改变。
例子 21-2. 引用与 foreach 语句 <?php $ref = 0; $row =& $ref; foreach (array(1, 2, 3) as $row) { // do something } echo $ref; // 3 - last element of the iterated array ?>
警告
复杂数组最好拷贝而不是引用。下面的例子不会如期望中那样工作。
例子 21-3. 复杂数组的引用
<?php $top = array( 'A' => array(), 'B' => array( 'B_b' => array(), ), ); $top['A']['parent'] = &$top; $top['B']['parent'] = &$top; $top['B']['B_b']['data'] = 'test'; print_r($top['A']['parent']['B']['B_b']); // array() ?>
引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。例如:
<?php function foo(&$var) { $var++; } $a=5; foo($a); ?>
将使 $a 变成 6。这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。更多详细解释见PHP的引用传递。
引用做的第三件事是PHP的引用返回。
| PHP变量简明教程 | PHP变量的作用范围 | PHP变量的声明 | PHP的预定义变量 | PHP变量函数 | PHP的外部变量 |
| PHP的可变变量 |


