PHP 5 0物件模型深度探索之構造和析構

2022-04-08 03:43:03 字數 1678 閱讀 8443

如果你在乙個類中宣告乙個函式,命名為__construct,這個函式將被當成是乙個建構函式並在建立乙個物件例項時被執行。清楚地說,__是兩個下劃線。就像其它任何函式一樣,建構函式可能有引數或者預設值. 你可以定義乙個類來建立乙個物件並將其屬性全放在乙個語句(statement)中。

你也可以定義乙個名為__destruct的函式,php將在物件被銷毀前呼叫這個函式. 它稱為析構函式.

繼承是類的乙個強大功能。乙個類(子類/派生類)可以繼承另一類(父類/基類)的功能. 派生類將包含有基類的所有屬性和方法,並可以在派生類中加上其他屬性和方法。你也可以覆寫基類的方法和屬性。就像前文中顯示的,你可以用extends關鍵字來繼承乙個類。

你可能想知道建構函式是如何被繼承的。當它們和其它方法一起被繼承時,他們不會在建立物件時被執行。

如果你需要這個功能,你需要用第二章提到的::運算子. 它允許你指向一塊命名空間. parent指向父類命名空間,你可以用parent::__construct來呼叫父類的建構函式。

一些物件導向語言在類之後命名建構函式。php的前幾個版本也是如此,到現在這種方法仍然有效.也就是:如果你把乙個類命名為animal並且在其中建立乙個命名也是animal的方法,則這個方法就是建構函式.如果乙個類的同時擁有__construt建構函式和與類名相同的函式,php將把__construct看作建構函式。這使得用以前的php版本所寫的類仍然可以使用. 但新的指令碼(php5)應當使用__construct。

php的這種新的宣告建構函式的方法可以使建構函式有乙個獨一無二的名稱,無論它所在的類的名稱是什麼。這樣你在改變類的名稱時,就不需要改變建構函式的名稱。

你可能在php中給建構函式乙個像其它類方法一樣的訪問方式。訪問方式將會影響從一定範圍內例項化物件的能力。這允許實現一些固定的設計模式,如singleton模式。

析構函式,相反於建構函式。php呼叫它們來將乙個物件從記憶體中銷毀。預設地,php僅僅釋放物件屬性所占用的記憶體並銷毀物件相關的資源。析構函式允許你在使用乙個物件之後執行任意**來清除記憶體。

當php決定你的指令碼不再與物件相關時,析構函式將被呼叫. 在乙個函式的命名空間內,這會發生在函式return的時候. 對於全域性變數,這發生於指令碼結束的時候. 如果你想明確地銷毀乙個物件,你可以給指向該物件的變數分配任何其它值. 通常將變數賦值勤為null或者呼叫unset。

下面的例子中,計算從類中例項化的物件的個數. counter類從建構函式開始增值,在析構函式減值。

一旦你定義了乙個類,你可以用new來建立乙個這個類的例項. 類的定義是設計圖,例項則是放在裝配線上的元件. new需要類的名稱,並返回該類的乙個例項。如果建構函式需要引數,你應當在new後輸入引數。

class counter

function __destruct()

function getcount()

} //建立第乙個例項

$c = new counter();

//輸出1

print($c->getcount() . "n");

//建立第二個例項

$c2 = new counter();

//輸出2

print($c->getcount() . "n");

//銷毀例項

$c2 = null;

//輸出1

print($c->getcount() . "n");

?>

PHP 5 0物件模型深度探索之繫結

除了限制訪問,訪問方式也決定哪個方法將被子類呼叫或哪個屬性將被子類訪問.函式呼叫與函式本身的關聯,以及成員訪問與變數記憶體位址間的關係,稱為繫結。在計算機語言中有兩種主要的繫結方式 靜態繫結和動態繫結。靜態繫結發生於資料結構和資料結構間,程式執行之前.靜態繫結發生於編譯期,因此不能利用任何執行期的資...

PHP 5 0物件模型深度探索之屬性和方法

乙個物件例項的屬性是變數,就像php的其他變數一樣。但是你必須使用 運算子來引用它們。不需要在屬性前使用美元符 可以聯用 如果乙個物件的屬性包含了乙個物件,你可以使用兩個 運算子來得到內部物件的屬性.你甚至可以用雙重引用的字串來放置這些表示式.下面的例子中,物件house中的屬性room包含了一組r...

PHP5 0物件模型深度探索之類的靜態成員

類的靜態成員與一般的類成員不同 靜態成員與物件的例項無關,只與類本身有關。他們用來實現類要封裝的功能和資料,但不包括特定物件的功能和資料,靜態成員包括靜態方法和靜態屬性。靜態屬性包含在類中要封裝的資料,可以由所有類的例項共享。實際上,除了屬於乙個固定的類並限制訪問方式外,類的靜態屬性非常類似於函式的...