PHP 物件和引用

2021-06-21 22:01:02 字數 786 閱讀 7869

一直以為認為的「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...