一直以為認為的「php5 物件預設是引用傳遞的」,這個想法貌似是不對的。
看下面的例子
<?php
class a
class b
public function bar(a $bar)
public function ref(a &$bar)
}$f = new a;
$g = new b;
echo $f->foo . "\n"; // 輸出1
$g->foo($f);
echo $f->foo . "\n"; // 輸出 42
$g->bar($f);
echo $f->foo . "\n"; // 這時候還是42 矛盾點
$g->ref($f);
echo $f->foo . "\n"; // 輸出1
?>
我們引用php官網上的一段話:
「在php5 的物件程式設計經常提到的乙個關鍵點是「預設情況下物件是通過引用傳遞的」。但其實這不是完全正確的。下面通過一些例子來說明。
php的引用是別名,就是兩個不同的變數名字指向相同的內容。在php5,乙個物件變數已經不再儲存整個物件的值。只是儲存乙個識別符號來訪問真正的物件內容。 當物件作為引數傳遞,作為結果返回,或者賦值給另外乙個變數,另外乙個變數跟原來的不是引用的關係,只是他們都儲存著同乙個識別符號的拷貝,這個識別符號指向同乙個物件的真正內容。」
在new 的時候,就新建立了乙個物件內容,然後識別符號指向新的物件內容,這樣可以解釋例3的輸出
物件和物件引用
每天都在變化,每天都在進步 基礎情況 a a new a a a 建立了個a 型別的引用a,此時指向null new a 在堆中建立了乙個類a的物件,返回其引用位址 將物件的位址給予引用 情景1a a new a 01 a b a 02 a null 03 此時b仍然有資料,因為 02 的時候,發生...
物件和物件引用
class vehicle 有了這個模板,就可以用它來建立物件 vehicle veh1 new vehicle 通常把這條語句的動作稱之為建立乙個物件,其實,它包含了四個動作。1 右邊的 new vehicle 是以vehicle類為模板,在堆空間裡建立乙個vehicle類物件 也簡稱為vehic...
PHP手冊 php物件的引用
class a class b function normalassignment obj function referenceassignment obj a new a b a b foo abc 對 a的成員造成了影響 b new b 不影響 a echo a foo abc normalas...