php建構函數與析構函數 php記憶體管理函數

WBOY
發布: 2016-07-25 08:53:52
原創
737 人瀏覽過
  1. class person{
  2. var $name;
  3. var $age;
  4. function __construct(){/ / 建構子
  5. $this->name="lisi";
  6. $this->age=28;
  7. }
  8. function say(){
  9. echo "my name is ".$this->name."
    ";
  10. echo "my age is ".$this->age."

    ";

  11. }
  12. }
  13. $per =new person();
  14. $per->say();
  15. $per->name="zhangsan";
  16. $per->age=26;
  17. $per->say( );
  18. ?>
複製程式碼

與建構子相對的就是析構函式。析構函數是php5新加入的內容,在php4中沒有析構函式。析構函數允許在銷毀一個類別之前執行的一些操作或完成一些功能,這些操作或功能通常在所有對該類別的引用都被重置或超出作用域時自動發生。 與建構子的名稱類似,一個類別的析構函式名稱必須是__ destruct()。析構函數不能帶有任何參數。

  1. class person {
  2. function __destruct()
  3. {
  4. echo "bye bye !" }
  5. }
  6. $a=new person();
  7. ?>
複製程式碼

如果你在一個類別中宣告一個函數,命名為__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. class counter {
  2. private static $count = 0; function __construct() { self::count ; }
  3. function __destruct() { self::$count--; }
  4. function getcount() { return self::$count; } }
  5. //建立第一個實例,呼叫建構子,$count = 1
  6. $c = new counter();
  7. //輸出1
  8. print($c->getcount() . "
    ");
  9. //建立第二個實例,呼叫建構函數,$count = 2
  10. $c2 = new counter();
  11. //輸出2
  12. print($c->getcount() . "
    " );
  13. //銷毀實例,呼叫析構函數,$count = 1
  14. $c2 = null;
  15. //輸出1
  16. print($c->getcount() . "
    ");
  17. ?>
複製程式碼
程式運作結果: 1 2 1 當新建一個php析構函數實例,記憶體會被準備來儲存所有屬性。 每個實例都有自己獨有的一組屬性。 但方法是由該類別的所有實例共享的。


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板