返回引用時,函數定義與調用處都必須加 & 符號,不可省略:
function &getRef() { ... }
$var = &getRef();
<?php
$color = 'YellowGreen';
function &getRef() {
global $color;
return $color;
}
function getCopy() {
global $color;
return $color;
}
$colorRef = &getRef();
$colorRef = 'Blue';
// $colorCopy = getCopy();
// $colorCopy = 'Black';
var_dump($color); // string(4) "Blue"
var_dump($colorRef); // string(4) "Blue"
// var_dump($colorCopy);
?>
$colorRef 與 $color 綁定同一記憶體位址,修改任一者另一者同步變化。
| 版本 | getCopy() 返回 | &getRef() 返回 |
|---|---|---|
| PHP 4 | 物件複製 | 引用 |
| PHP 5.0 ~ 5.1.x | 引用(視具體版本) | 引用 |
| PHP 5.2+ | 物件複製 | 引用 |
關鍵點:PHP 5 起物件預設傳遞「物件標識符」(類似引用),但 getCopy() 仍會複製標識符,而 &getRef() 綁定變量容器本身。
放入類內部時,行為更為複雜,建議查閱官方手冊 語言.引用 章節。
返回引用不會提高效能,某些情況反而降低效能。切勿為了「優化」而濫用此特性。
一般業務代碼強烈建議避免使用,除非你完全理解其語義與副作用。