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

PHP 物件導向完整筆記:封裝、繼承、多態與魔術方法

     編輯:PHP 綜合知識

PHP 5 完善物件模型,支援可見度控制、建構子/解構子、魔術方法等完整 OOP 特性。本文系統整理類別定義、三大特性、魔術方法、靜態成員等核心知識點。

一、可見度控制

關鍵字本類子類外部使用場景
public✓✓✓公開 API
protected✓✓✗內部邏輯、子類擴展
private✓✗✗核心封裝、防誤用

二、OOP 三大特性

1. 封裝性

將資料與操作綁定,對外僅暴露有限介面。優點:降低耦合、隱藏實作細節、便於維護。

2. 繼承性

子類自動擁有父類非 private 成員,可覆寫或新增。PHP 單一繼承(一個父類),介面支援多實作。

3. 多態性

同一方法在不同物件呈現不同行為。透過繼承覆寫或介面實作達成,提升彈性與擴展性。

三、類別定義與實例化

<?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();            // 呼叫方法
?>

四、建構子與解構子

__construct():初始化

<?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");
?>

__destruct():清理資源

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

七、魔術方法速查

方法觸發時機回傳值要求
__constructnew 實例化無
__destruct物件銷毀無
__toString物件作字串用必須回傳 string
__invoke物件作函數呼叫任意
__call呼叫不存在實例方法任意
__callStatic呼叫不存在靜態方法任意
__get讀取不可存取屬性任意
__set寫入不可存取屬性無
__issetisset/empty 檢查不可存取屬性bool
__unsetunset 不可存取屬性無
__sleepserialize() 前array(屬性名列表)
__wakeupunserialize() 後無
__cloneclone 物件無
__set_statevar_export() 類別object
__debugInfovar_dump() 物件array

八、程式碼規範建議

  1. 方法名:camelCase,動詞開頭(getUser()、saveData())
  2. 屬性名:camelCase,名詞($userName、$maxCount)
  3. 常數:UPPER_SNAKE_CASE(MAX_SIZE)
  4. 類別名:PascalCase(NbaPlayer、UserService)
  5. 縮排:4 空格,禁止 Tab
  6. 嚴格型別宣告:declare(strict_types=1)
  7. 介面優於實作依賴,組合優於繼承

掌握 PHP OOP 核心機制,配合現代框架(Laravel、Symfony)的服務容器、依賴注入、契約介面,能構建高內聚、低耦合、可測試的企業級應用。

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