在 PHP 對(duì)象編程經(jīng)常提到的一個(gè)關(guān)鍵點(diǎn)是“默認(rèn)情況下對(duì)象是通過引用傳遞的”。但其實(shí)這不是完全正確的。下面通過一些例子來說明。
PHP 的引用是別名,就是兩個(gè)不同的變量名字指向相同的內(nèi)容。在 PHP 中,一個(gè)對(duì)象變量不再保存整個(gè)對(duì)象的值。只是保存一個(gè)標(biāo)識(shí)符來訪問真正的對(duì)象內(nèi)容。 當(dāng)對(duì)象作為參數(shù)傳遞,作為結(jié)果返回,或者賦值給另外一個(gè)變量,另外一個(gè)變量跟原來的不是引用的關(guān)系,只是他們都保存著同一個(gè)標(biāo)識(shí)符的拷貝,這個(gè)標(biāo)識(shí)符指向同一個(gè)對(duì)象的真正內(nèi)容。
示例 #1 引用和對(duì)象
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a; // $a ,$b都是同一個(gè)標(biāo)識(shí)符的拷貝
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c; // $c ,$d是引用
// ($c,$d) = <id>
$d->foo = 2;
echo $c->foo."\n";
$e = new A;
function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?>
以上例程會(huì)輸出:
2 2 2