物件生命週期
- 建構子:
__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'; }。