類與對象
自 PHP 5 起完全重寫了對象模型以得到更佳性能和更多特性。這是自 PHP 4 以來的最大變化。PHP 5 具有完整的對象模型;
- 創建對象有三種方式:new class, new object, class::getNew();
- 當覆蓋方法時,參數必須保持一致否則 PHP 將發出 E_STRICT 級別的錯誤信息。但構造函數例外,構造函數可在被覆蓋時使用不同的參數;
- 自 PHP 5.5 起,關鍵詞 class 也可用於類名的解析。使用 ClassName::class 你可以獲取一個字符串,包含了類 ClassName 的完全限定名稱。這對使用了 命名空間 的類尤其有用;
- 自 PHP 5.3.0 起,可以用一個變量來動態調用類。但該變量的值不能爲關鍵字(如 self,parent 或 static);
屬性
- 屬性中的變量可以初始化,但是初始化的值必須是常數,這裏的常數是指 PHP 腳本在編譯階段時就可以得到其值,而不依賴於運行時的信息才能求值;
類常量
- 可以把在類中始終保持不變的值定義爲常量。在定義和使用常量的時候不需要使用 $ 符號
類的自動加載
spl_autoload_register()
函數可以註冊任意數量的自動加載器,當使用尚未被定義的類(class)和接口(interface)時自動去加載。通過註冊自動加載器,腳本引擎在 PHP 出錯失敗前有了最後一個機會加載所需的類;- 儘管
__autoload()
函數也能自動加載類和接口,但更建議使用spl_autoload_register()
函數。spl_autoload_register()
提供了一種更加靈活的方式來實現類的自動加載(同一個應用中,可以支持任意數量的加載器,比如第三方庫中的)。因此,不再建議使用__autoload()
函數,在以後的版本中它可能被棄用;
構造函數和析構函數
- 如果子類中定義了構造函數則不會隱式調用其父類的構造函數。要執行父類的構造函數,需要在子類的構造函數中調用 parent::__construct();
- 與其它方法不同,當
__construct()
被與父類__construct()
具有不同參數的方法覆蓋時,PHP 不會產生一個 E_STRICT 錯誤信息; - 和構造函數一樣,父類的析構函數不會被引擎暗中調用。要執行父類的析構函數,必須在子類的析構函數體中顯式調用 parent::__destruct()。此外也和構造函數一樣,子類如果自己沒有定義析構函數則會繼承父類的;
- 試圖在析構函數(在腳本終止時被調用)中拋出一個異常會導致致命錯誤;
訪問控制
- 同一個類的對象即使不是同一個實例也可以互相訪問對方的私有與受保護成員。這是由於在這些對象的內部具體實現的細節都是已知的。
對象繼承
- 除非使用了自動加載,否則一個類必須在使用之前被定義。如果一個類擴展了另一個,則父類必須在子類之前被聲明。此規則適用於類繼承其它類與接口;
範圍解析操作符 (::)
- self,parent 和 static 這三個特殊的關鍵字是用於在類定義的內部對其屬性或方法進行訪問的