PHP 5 完善物件模型,支援可見度控制、建構子/解構子、魔術方法等完整 OOP 特性。本文系統整理類別定義、三大特性、魔術方法、靜態成員等核心知識點。
| 關鍵字 | 本類 | 子類 | 外部 | 使用場景 |
|---|---|---|---|---|
| public | ✓ | ✓ | ✓ | 公開 API |
| protected | ✓ | ✓ | ✗ | 內部邏輯、子類擴展 |
| private | ✓ | ✗ | ✗ | 核心封裝、防誤用 |
將資料與操作綁定,對外僅暴露有限介面。優點:降低耦合、隱藏實作細節、便於維護。
子類自動擁有父類非 private 成員,可覆寫或新增。PHP 單一繼承(一個父類),介面支援多實作。
同一方法在不同物件呈現不同行為。透過繼承覆寫或介面實作達成,提升彈性與擴展性。
<?php
class NbaPlayer {
// 屬性
public $name = "Jordan";
public $height = "198cm";
public $team = "Bull";
public $playerNumber = "23";
// 方法
public function run() { echo "Running\n"; }
public function dribble() { echo "Dribbling\n"; }
public function pass() { echo "Passing\n"; }
}
// 實例化
$jordan = new NbaPlayer();
echo $jordan->name . "\n"; // 存取屬性
$jordan->dribble(); // 呼叫方法
?>
<?php
class NbaPlayer {
public $name, $height, $weight, $team;
public function __construct($name, $height, $weight, $team) {
echo "NbaPlayer constructor\n";
$this->name = $name;
$this->height = $height;
$this->weight = $weight;
$this->team = $team;
}
public function run() { echo "Running\n"; }
}
$jordan = new NbaPlayer("Jordan", "198cm", "98kg", "Bull");
$james = new NbaPlayer("James", "203cm", "120kg", "Heat");
?>
<?php
class NbaPlayer {
// ... 建構子同前
public function __destruct() {
echo "Destroying {$this->name}\n";
// 釋放資料庫連線、關閉檔案控制代碼等
}
}
$jordan = new NbaPlayer("Jordan", "198cm", "98kg", "Bull");
$james = new NbaPlayer("James", "203cm", "120kg", "Heat");
$james = null; // 手動觸發解構子
echo "from now on James will not be used.\n";
?>
輸出順序:建構子 ×2 → James 解構子 → 程式結束 Jordan 解構子
<?php
$james = new NbaPlayer("James", "203cm", "120kg", "Heat");
$james1 = $james; // 複製參考(指向同一物件)
$james2 = &$james; // 別名(完全同一變數)
$james = null; // 刪除一個參考
// $james1 仍指向物件,$james2 也為 null
// 直到所有參考被刪除才觸發 __destruct
?>
<?php
class Counter {
public static $count = 0;
public $id;
public function __construct() {
$this->id = ++self::$count; // 類內部用 self::
}
public static function getCount() {
return self::$count;
}
}
$c1 = new Counter();
$c2 = new Counter();
echo Counter::$count; // 2 (外部用 類名::)
echo Counter::getCount(); // 2
?>
| 方法 | 觸發時機 | 回傳值要求 |
|---|---|---|
| __construct | new 實例化 | 無 |
| __destruct | 物件銷毀 | 無 |
| __toString | 物件作字串用 | 必須回傳 string |
| __invoke | 物件作函數呼叫 | 任意 |
| __call | 呼叫不存在實例方法 | 任意 |
| __callStatic | 呼叫不存在靜態方法 | 任意 |
| __get | 讀取不可存取屬性 | 任意 |
| __set | 寫入不可存取屬性 | 無 |
| __isset | isset/empty 檢查不可存取屬性 | bool |
| __unset | unset 不可存取屬性 | 無 |
| __sleep | serialize() 前 | array(屬性名列表) |
| __wakeup | unserialize() 後 | 無 |
| __clone | clone 物件 | 無 |
| __set_state | var_export() 類別 | object |
| __debugInfo | var_dump() 物件 | array |
camelCase,動詞開頭(getUser()、saveData())camelCase,名詞($userName、$maxCount)UPPER_SNAKE_CASE(MAX_SIZE)PascalCase(NbaPlayer、UserService)declare(strict_types=1)掌握 PHP OOP 核心機制,配合現代框架(Laravel、Symfony)的服務容器、依賴注入、契約介面,能構建高內聚、低耦合、可測試的企業級應用。