一、PHP 高級 OOP 核心概念(從基礎到進階)
先明確:PHP 5.4 + 全面支持現代 OOP 特性,PHP 7/8 進一步優化了性能和語法,以下是高級階段必掌握的核心:
|
概念
|
核心作用
|
極簡代碼示例
|
|
抽象類(abstract) |
定義規範,不能實例化,強制子類實現抽象方法
|
```php
|
|
abstract class BaseController {
|
|
|
|
abstract public function index (); // 抽象方法,無實現
|
|
|
|
}
|
|
|
|
class UserController extends BaseController {
|
|
|
|
public function index () { // 必須實現
|
|
|
|
echo "用户列表";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
| **接口(interface)** | 純規範定義,多實現(PHP單繼承、多接口) | ```php
interface Payable {
public function pay($amount);
}
class Alipay implements Payable {
public function pay($amount) {
echo "支付寶支付{$amount}元";
}
}
class WechatPay implements Payable {
public function pay($amount) {
echo "微信支付{$amount}元";
}
}
``` |
| **特質(trait)** | 解決單繼承限制,複用代碼塊 | ```php
trait LogTrait {
public function log($msg) {
echo "日誌:{$msg}";
}
}
class Order {
use LogTrait; // 引入trait
public function create() {
$this->log("創建訂單"); // 直接使用trait方法
}
}
``` |
| **魔術方法(進階)** | 增強類的靈活性,如`__call`/`__get`/`__set` | ```php
class User {
private $data = [];
// 訪問私有屬性時觸發
public function __get($key) {
return $this->data[$key] ?? null;
}
// 賦值私有屬性時觸發
public function __set($key, $value) {
$this->data[$key] = $value;
}
}
$user = new User();
$user->name = "張三"; // 觸發__set
echo $user->name; // 觸發__get,輸出張三
``` |
| **依賴注入(DI)** | 解耦類與類之間的依賴,便於測試和擴展 | ```php
class Db {
public function query($sql) { echo "執行SQL:{$sql}"; }
}
// 傳統方式:內部實例化,耦合高
class UserModel1 {
private $db;
public function __construct() {
$this->db = new Db();
}
}
// 依賴注入:外部傳入,解耦
class UserModel2 {
private $db;
public function __construct(Db $db) { // 類型提示
$this->db = $db;
}
}
$db = new Db();
$model = new UserModel2($db); // 注入Db實例
``` |
### 二、PHP高級OOP實戰特性(項目中高頻使用)
#### 1. 設計模式(OOP的落地實踐)
PHP中最常用的OOP設計模式,解決通用業務問題:
- **單例模式**:確保一個類只有一個實例(如數據庫連接類);
- **工廠模式**:統一創建對象(如支付方式工廠,根據類型創建Alipay/WechatPay);
- **觀察者模式**:實現事件監聽(如訂單創建後,觸發短信、日誌、庫存更新)。
#### 2. 命名空間與自動加載
- **命名空間(namespace)**:解決類名衝突,大型項目必備:
```php
// app/Model/User.php
namespace App\Model;
class User {}
// 調用
use App\Model\User;
$user = new User();
- 自動加載:使用
composer的PSR-4規範,無需手動require文件,框架(Laravel/ThinkPHP)核心機制。
3. 類型提示與返回值類型
PHP 7 + 支持,提升代碼可讀性和健壯性:
php
運行
// 參數類型提示 + 返回值類型
function getUserById(int $id): ?User {
// 邏輯...
return $id > 0 ? new User() : null;
}
三、高級 OOP 最佳實踐(避坑 + 規範)
- 遵循 SOLID 原則:
- 單一職責:一個類只做一件事(如 UserModel 只處理用户數據,不處理支付);
- 開閉原則:對擴展開放,對修改關閉(通過接口 / 抽象類擴展功能,而非修改原有代碼)。
- 避免過度封裝:簡單功能無需強行抽象,以 “易維護” 為核心;
- 使用接口解耦:依賴接口而非具體實現,便於替換組件(如替換支付方式無需改業務代碼);
- 利用 trait 複用代碼:但避免濫用(trait 過多會導致類邏輯混亂)。
總結
- PHP 高級 OOP 核心是抽象類、接口、trait、依賴注入,解決代碼複用、解耦、擴展問題;
- 實戰中需結合設計模式、命名空間、類型提示,寫出符合工業級標準的代碼;
- 學習關鍵是 “場景化落地”,而非死記概念,比如用工廠模式實現支付方式擴展。