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

PHP 面向物件開發七大良好習慣:從封裝到設計模式

     編輯:PHP 綜合知識

早期 PHP 以程序式為主,現代框架(Laravel, Symfony)皆以 OOP 為核心。良好的 OOP 習慣決定專案長期可維護性。本文整理七大核心習慣,對應封裝、耦合、內聚、多型、設計模式等關鍵面向。

習慣一:保持謙虛——封裝與資訊隱藏

  • 屬性宣告為 private,透過 public 存取方法(getter/setter)控制存取。
  • 隱藏實作細節,讓內部變更不波及外部呼叫端。
  • 範例:將 public $items = []; 改為 private $items = []; + getItems(),未來可改用 Collection 物件而不影響呼叫端。

習慣二:做個好鄰居——低耦合、高內聚

  • 類別間依賴抽象(介面),不依賴具體實作。
  • 單一職責:一個類別只做一件事,相關資料與行為聚合在一起。
  • 避免「特徵依恋」:若類別 A 大量呼叫類別 B 的 getter 後操作資料,應將操作移至 B 內部。

習慣三:避免看見美杜莎——限制物件圖深度

  • 「美杜莎」指過深的物件鏈:$order->getCustomer()->getAddress()->getCity()->getName()。
  • 違反迪米特法則:只與直接朋友溝通。
  • 解法:在 Order 加入 getCustomerCityName() 或使用 DTO 扁平化資料。

習慣四:利用最弱的鏈結——依賴倒置與介面隔離

  • 依賴抽象(介面),不依賴具體類別。
  • 介面應盡量小、專一(介面隔離原則),避免實作類被迫實作不需要的方法。
  • 建構子注入介面:public function __construct(LoggerInterface $logger)。

習慣五:你是橡膠;我是膠水——組合優於繼承

  • 繼承是強耦合(is-a),組合是鬆耦合(has-a)。
  • 優先使用策略模式、裝飾器模式替代深層繼承樹。
  • PHP trait 可作為橫切關注點複用,但需謹慎避免命名衝突。

習慣六:限制傳播——變更封裝與事件驅動

  • 變更不應像病毒般擴散至無關模組。
  • 使用事件/觀察者模式解耦:$eventDispatcher->dispatch(new OrderCreated($order))。
  • 領域事件讓上游不需知道下游細節。

習慣七:考慮使用模式——設計模式作為共同語彙

  • 創建型:Factory, Builder, Singleton(慎用)。
  • 結構型:Adapter, Decorator, Composite。
  • 行為型:Strategy, Observer, Command, Template Method。
  • 模式非銀彈,但提供經驗證證的解決方案與團隊溝通術語。

程式碼對比:重構前 vs 重構後

// 違反習慣 1,2,3,5
class UserController {
    public function register(Request $request) {
        $user = new User();
        $user->name = $request->name;           // 直接存取屬性
        $user->email = $request->email;
        $user->password = md5($request->pwd);   // 弱雜湊、邏輯外洩
        $user->save();
        Mail::send('welcome', ['user' => $user]); // 耦合郵件發送
        return redirect('/login');
    }
}

// 遵循七大習慣
class UserController {
    public function __construct(
        private UserRepository $repo,
        private PasswordHasher $hasher,
        private EventDispatcher $events
    ) {}

    public function register(RegisterRequest $request) {
        $user = User::create(
            $request->name,
            $request->email,
            $this->hasher->hash($request->password)
        );
        $this->repo->save($user);
        $this->events->dispatch(new UserRegistered($user));
        return redirect('/login');
    }
}

總結

七大習慣核心在於封裝變化點、依賴抽象、組合行為。持續練習、Code Review 互相檢視、引入靜態分析(PHPStan Level 8+),能讓團隊內化為肌肉記憶。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved