PHP之 析構函式

2022-04-04 13:27:21 字數 3687 閱讀 3397

如何正確理解php析構函式

參考文獻:

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

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

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

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

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

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

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

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

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

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

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

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

1

< ?php 23

class counter 67

function __destruct() 89

function getcount() }

1011

//建立第乙個例項

1213

$c = new

counter();

1415

//輸出1

1617

print($c->getcount() . "

\n");

1819

//建立第二個例項

2021

$c2 = new

counter();

2223

//輸出2

2425

print($c->getcount() . "

\n");

2627

//銷毀例項

2829

$c2 = null

;

3031

//輸出1

3233

print($c->getcount() . "

\n");

3435 ?>

當你新建了乙個php析構函式例項,記憶體會被準備來儲存所有屬性. 每個例項有自己獨有的一組屬性. 但方法是由該類的所有例項共享的.

php 5 允行開發者在乙個類中定義乙個方法作為建構函式。具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。

note: 如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫parent::__construct()。如果子類沒有定義建構函式則會如同乙個普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話)。

example #1 使用新標準的建構函式

<?php

class

baseclass

}class subclass extends

baseclass

}class othersubclass extends

baseclass

//in baseclass constructor

$obj = new

baseclass();

//in baseclass constructor

// in subclass constructor

$obj = new

subclass();

//in baseclass constructor

$obj = new

othersubclass();

?>

為了實現向後相容性,如果 php 5 在類中找不到 __construct() 函式並且也沒有從父類繼承乙個的話,它就會嘗試尋找舊式的建構函式,也就是和類同名的函式。因此唯一會產生相容性問題的情況是:類中已有乙個名為 __construct() 的方法卻被用於其它用途時。

與其它方法不同,當 __construct() 被與父類 __construct() 具有不同引數的方法覆蓋時,php 不會產生乙個e_strict錯誤資訊。

自 php 5.3.3 起,在命名空間中,與類名同名的方法不再作為建構函式。這一改變不影響不在命名空間中的類。

example #2 constructors in namespaced classes

<?php

namespace foo;

class bar 

}?>

void __destruct ( void )

php 5 引入了析構函式的概念,這類似於其它物件導向的語言,如 c++。析構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷毀時執行。

example #3 析構函式示例

<?php

class

mydestructableclass

function

__destruct()

}$obj = new

mydestructableclass();

?>

和建構函式一樣,父類的析構函式不會被引擎暗中呼叫。要執行父類的析構函式,必須在子類的析構函式體中顯式呼叫 parent::__destruct()。此外也和建構函式一樣,子類如果自己沒有定義析構函式則會繼承父類的。

析構函式即使在使用 exit() 終止指令碼執行時也會被呼叫。在析構函式中呼叫 exit() 將會中止其餘關閉操作的執行。

php析構函式使用,php析構方法怎麼用

php 5 引入了析構函式的概念,這類似於其它物件導向的語言,如 c 析構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷毀時執行。析構函式示例 class mydestructableclass function construct print in constructor n this n...

php 析構函式,建構函式

測試使用的php操作類 date 2017 7 13 time 14 22 class test 析構函式 destruct 也是乙個魔術方法 它是在物件被銷毀時自動被呼叫 它不能帶引數 public function destruct 測試使用的方法 param 引數值說明 return 返回值的...

Python之析構函式

析構函式 與建構函式 建立物件的時候第乙個被自動呼叫的函式 init 相反,當物件被銷毀的時候自動呼叫的函式 del 被稱為析構函式 物件銷毀 程式執行完畢,使用del刪除,即物件被銷毀 使用場景 物件即將被銷毀的時候需要做一些工作,比如 關閉檔案,關閉資料庫,關閉各種資源 import time ...