[精讚] [會員登入]
554

[PHP] 類別的繼承及建構子和解構子

PHP 類別的繼承及建構子和解構子

此文完整連結 http://n.sfs.tw/10582

複製連結 [PHP] 類別的繼承及建構子和解構子@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2017-06-03 12:08:37 最後編修
2017-01-09 11:49:02 By 瘦河馬
 

1. php 的建構子

php 的建構子會在類別實體化(也就是new之後)後執行,寫法有兩種,一個是用 __construct() 保留字,另一個是用和類別同名的函式

class BASE{
   function __construct(){
      print "BASE constructor";
   }
}

或是

class BASE{
   function BASE(){
      print "constructor function same name with class";
   }
}

若同時有兩個建構子,則以  __construct() 為優先,同類別名的函數將不會被執行

我個人建議使用 __construct(),因為類別可能因為改名或複製,常會忘記把建構子也改名。

class BASE{
   function BASE(){
      print "constructor function same name with class";
   }
   function __construct(){
      print "BASE constructed";
   }
}

執行結果:
BASE constructor

2. php 的解構子

php 的解構子會在1程式執行到結尾 2程式exit 3物件被unset 後被執行,寫法用 __desctruct() 保留字

class BASE{
   function __construct(){
      print "BASE constructedn";
   }
   function __destruct(){
      print "BASE destructedn";
   }
}

執行:

$obj =new BASE();
unset($obj);   <== 物件被 unset
print "ENDn";
exit;

結果
BASE constructed
BASE destructed
END

3. 建構和解構函數只不過是一個函數,預設是 public,都可以被叫用。


夏天的白雲特別白

4. 子類別繼承父類別後,父類別的建解構子都不會被執行

曾經我在這被卡了很久,因為別的語言(java, c#)會去叫用父類別的建解樣子後再處理子類別的。


class BASE{
   function BASE(){
      print "constructor function same name with class";
   }
   function __destruct(){
      print "BASE destructed";
   }
}

class CHILD extends BASE{
   function __construct(){
     print "CHILD constructed";
   }
   function __destruct(){
     print "CHILD destructed";
   }
}

執行
$obj =new CHILD();
exit;

結果
CHILD constructed
CHILD destructed

5. 子類別要執行父類別的建解構子,就要特別叫用,使用 parent:: 保留字

class BASE{
   function BASE(){
      print "constructor function same name with class";
   }
   function __destruct(){
      print "BASE destructed";
   }
}

class CHILD extends BASE{
   function __construct(){
     parent::__construct();
     print "CHILD constructed";
   }
   function __destruct(){
     parent::__destruct();
     print "CHILD destructed";
   }
}

執行
$obj =new CHILD();
exit;

結果
constructor function same name with class
CHILD constructed
BASE destructed
CHILD destructed

以上小小經驗分享


原文 2011-06-07 21:24:13

你可能感興趣的文章

[PHP] 移除檔案的UTF8 BOM 移除檔案的UTF8 BOM

[PHP] 檢查檔案是否是圖檔 使用getimagesize函數檢查檔案是否是圖檔

[CodeIgniter 3] 取得controller和method的方法 CodeIgniter 3 取得controller和method的方法

[PHP] 取得檔名和路徑:basename, dirname 由絕對路徑取的路徑及檔名的方法

[PHP] 處理mail 函式的標題中文字亂碼 PHP的mail函式若標題有中文字得先處理過,否則收信者會看到亂碼

[PHP]解決ksort新增的SORT_NATURAL|SORT_FLAG_CASE方法 php>=5.4中ksort函數多了SORT_NATURAL 和 SORT_FLAG_CASE 旗標,對舊版的PHP中要怎麼辦?

[PHP7] 利用Memcached 儲存 Session Memcached+ PHP7,利用Memcached 儲存 Session。

[PHP] 將字串的部分加上遮罩的函式 有些資料會想要隱藏部分的字元,例如身分證號或信用卡號、電話等。我寫了一個函式來完成這個功能。

[PHP] 使用browscap檢查瀏覽器版本 使用PHP內建函數browscap檢查瀏覽器版本

[CodeIgniter 3] COOKIE的使用 PHP CodeIgniter 3 中COOKIE的使用超簡單

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

為什麼要買長達二十年的保單? 為什麼要買長達二十年的保單?找一個可以說服我買二十年保單的理由。

[HP DL380G7] 生效啟動第3,4片網卡/開啟或關閉內建的網卡 HP DL380G7 預設第3,4片網卡裝完系統後找不到,難道是壞了?要怎麼辦?

UTF-8的網頁但IE8一片空白 UTF8編碼的網頁在Firefox 正常顯示、但IE8 就是空白,IE8編碼設定是「自動偵測」可是自動偵測到的是 big5...

[大型機台] 熱血高校躲避球 多少少年時光歲月耗在這個遊戲上,二十幾年前的那個時光,唯一想做的事就是把吃飯錢省下來拿去打一場五塊錢的電動,就算是沒錢也

對物品的感情 這個議題很奇怪,可是大部分的人都會有,物品是死的,壞了就淘汰,出新的就被替換。為何會有情感?