首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 物件導程式設計核心筆記:從建構子到自動載入

     編輯:PHP 綜合知識

物件生命週期

  • 建構子:__construct(),實例化時自動呼叫,PHP 5.3.3+ 不再支援同名類別方法作為建構子。
  • 解構子:__destruct(),物件銷毀 (引用計數歸零、腳本結束) 時自動呼叫。
  • 手動清理:可自訂 destroy()/cleanup(),但需開發者主動呼叫。
  • 循環引用:PHP 5.3+ 具備 GC (Garbage Collector),gc_collect_cycles() 可強制回收。

可見性與封裝

關鍵字存取範圍
public任意位置
protected類別內部、繼承類別、父類別
private僅定義該屬性/方法的類別內部 (子類別不可存取)

常數與靜態成員

  • 類別常數:const NAME = 'value',存取 ClassName::NAME (外部) 或 self::NAME (內部)。隱含 public,不可變更。
  • 靜態屬性:static $prop = 'val',全類別實例共享,可讀寫,支援 public/protected/private。
  • 靜態方法:static function foo(),無 $this,呼叫 ClassName::foo()。
  • 晚期靜態綁定 (LSB):PHP 5.3+ static:: 解析為實際調用類別,而非定義類別 (self::)。

抽象類別與介面

  • abstract class:不可實例化,可包含抽象方法 (無主體) 與具體方法。子類別必須實作所有抽象方法。
  • interface:純契約,僅宣告方法簽名 (預設 public),可定義常數。類別可 implements 多個介面。
  • 最佳實務:介面定義「能做什麼」,抽象類別提供「共用實作骨架」。

Final 與不可變性

  • final class:禁止繼承。
  • final function:禁止覆寫。
  • 善用 final 保護核心邏輯,配合 readonly (PHP 8.1+) 屬性實現不可變物件。

物件比較

運算子比較規則
==同類別且所有屬性值相等 (遞迴比較)
===同一個實例 (記憶體位址相同)

複製與字串轉換

  • 淺層複製:$b = clone $a,屬性若為物件仍共享參考。可實作 __clone() 深層複製或重置資源。
  • 字串轉換:實作 __toString(): string,支援 echo $obj、字串串接。

實用函式與魔術方法

  • get_class($obj):取得類別名稱 (含命名空間)。
  • get_object_vars($obj):取得可見屬性陣列。
  • method_exists($obj, 'method') / property_exists()。
  • Type Hint:函式參數宣告類別/介面,PHP 7.0+ 支援純量型別、?Type 可空、Type|Null 聯合型別 (PHP 8.0+)。

自動載入

spl_autoload_register(function ($class) {
    $file = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
    if (file_exists($file)) require $file;
});
  • PSR-4 標準:命名空間對應目錄結構,Composer 自動產生 vendor/autoload.php。
  • 避免使用 __autoload() (已棄用),改用 spl_autoload_register() 可註冊多個載入器。

現代 PHP 物件導向新特性 (PHP 8.0+)

  • Constructor Property Promotion:public function __construct(public string $name) {}
  • Readonly Properties:readonly public string $id,初始化後不可變更。
  • Named Arguments:new User(name: 'Tom', age: 18)。
  • Attributes:#[Route('/user')] 取代註解式中繼資料。
  • Enums:enum Status: string { case Active = 'active'; }。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved