萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP OOP 可見性控制:private 與 public 差異完整教學

PHP 5 引入可見性控制,讓類別成員(屬性、方法)能限定存取範圍。正確使用 private、public、protected 是封裝性的核心,也是寫出可維護程式碼的關鍵。

三種可見性關鍵字

關鍵字存取範圍PHP 4 相容寫法適用場景
public 任何地方(類別內、子類別、外部程式碼) var $var / function method() 需對外公開的 API、介面
private 僅限定義該成員的類別內部 不支援 內部實作細節、敏感資料、邏輯輔助
protected 類別內部 + 繼承的子類別 不支援 供子類別擴充/覆寫的成員

實戰範例:private vs public

<?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;
    }
}
?>

為什麼偏好 private?封裝性的價值

  1. 資料保護:防止外部任意修改內部狀態,導致不一致
  2. 介面穩定:內部實作可變更,不影響外部呼叫端
  3. 驗證控制:Setter 可加入驗證邏輯(如長度、格式、範圍檢查)
  4. 除錯容易:所有資料流經已知方法,易於追蹤與記錄
<?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(建構子自動執行)
?>
✅ 最佳實務: 屬性預設 private,方法預設 public。需要時再放寬至 protected(給子類別)或 public(給外部)。這是「最小權限原則」在 OOP 的體現。

PHP 4 vs PHP 5 差異對照

特性PHP 4PHP 5+
屬性可見性僅 var(等同 public)public/private/protected
建構子命名同類別名 function User()__construct()(推薦)
解構子不支援__destruct()
靜態成員不支援static 關鍵字
抽象類別/介面不支援完整支援
copyright © 萬盛學電腦網 all rights reserved