PHP 5 引入可見性控制,讓類別成員(屬性、方法)能限定存取範圍。正確使用 private、public、protected 是封裝性的核心,也是寫出可維護程式碼的關鍵。
| 關鍵字 | 存取範圍 | PHP 4 相容寫法 | 適用場景 |
|---|---|---|---|
public |
任何地方(類別內、子類別、外部程式碼) | var $var / function method() |
需對外公開的 API、介面 |
private |
僅限定義該成員的類別內部 | 不支援 | 內部實作細節、敏感資料、邏輯輔助 |
protected |
類別內部 + 繼承的子類別 | 不支援 | 供子類別擴充/覆寫的成員 |
<?php
$kirupa = new User();
// 嘗試存取 private 屬性(透過方法)
$kirupa->setName('Kirupa');
echo $kirupa->getName() . '<br />'; // 正常:Kirupa
// 直接存取 private 屬性 → 致命錯誤
// echo $kirupa->name . '<br />'; // Fatal error: Cannot access private property
// 直接存取 public 屬性 → 正常
$kirupa->location = 'MIT';
echo $kirupa->location . '<br />'; // MIT
class User {
private $name; // 僅能透過方法存取
public $location; // 可直接存取
function setName($val) {
$this->name = $val;
}
function getName() {
return $this->name;
}
}
?>
<?php
class User {
private string $email = '';
public function setEmail(string $email): void {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("無效 Email 格式");
}
$this->email = $email;
}
public function getEmail(): string {
return $this->email;
}
}
?>
方法同樣支援三種可見性,預設為 public:
<?php
class Service {
public function execute(): void { // 公開 API
$this->validateInput();
$this->process();
$this->logResult();
}
private function validateInput(): void { // 內部驗證
// ...
}
private function process(): void { // 核心邏輯
// ...
}
protected function logResult(): void { // 允許子類別覆寫記錄方式
// ...
}
}
?>
<?php
class User {
private string $job;
// PHP 5+ 魔術方法建構子
public function __construct() {
$this->job = 'Engineer'; // 初始化預設值
}
// PHP 4 風格建構子(已淘汰)
// function User() { ... }
public function getJob(): string {
return $this->job;
}
}
$kirupa = new User();
echo $kirupa->getJob(); // Engineer(建構子自動執行)
?>
| 特性 | PHP 4 | PHP 5+ |
|---|---|---|
| 屬性可見性 | 僅 var(等同 public) | public/private/protected |
| 建構子命名 | 同類別名 function User() | __construct()(推薦) |
| 解構子 | 不支援 | __destruct() |
| 靜態成員 | 不支援 | static 關鍵字 |
| 抽象類別/介面 | 不支援 | 完整支援 |