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

PHP 物件導向程式設計完整指南:從基礎到進階特性

     編輯:PHP 綜合知識

PHP OOP 核心三大支柱

  • 封裝: 透過 class 將資料 (var/public/protected/private) 與方法 (function) 綁定,使用 $this->property 存取成員。
  • 繼承: class Child extends Parent 繼承父類所有非私有成員,可覆寫方法、新增屬性。
  • 多型: 同一介面/父類型參數可接受不同子類物件,執行各自實作(PHP 5+ 透過介面/抽象類實現)。

基本類別定義與物件建立

<?php
class Something {
    // 命名慣例:類別 PascalCase、屬性/方法 camelCase
    public $x; // PHP 5+ 建議加可見性關鍵字

    public function setX($v) {
        $this->x = $v;
    }

    public function getX() {
        return $this->x;
    }
}

// 建立物件
$obj = new Something();
$obj->setX(5);
echo $obj->getX(); // 5

// 不建議直接存取屬性(破壞封裝)
// $obj->x = 6; // 可行但違反 OOP 原則
?>

繼承與覆寫

class Another extends Something {
    public $y;

    public function setY($v) { $this->y = $v; }
    public function getY() { return $this->y; }

    // 覆寫父類方法
    public function getX() {
        return "Child: " . parent::getX(); // 可呼叫 parent::method()
    }
}

$obj2 = new Another();
$obj2->setX(6);
$obj2->setY(7);
echo $obj2->getX(); // "Child: 6"
echo $obj2->getY(); // 7

注意: PHP 不支援多重繼承,但可用 trait (PHP 5.4+) 實現程式碼複用。

建構子與解構子

class Something {
    public $x;

    // PHP 5+ 建議使用 __construct()
    public function __construct($y = 3) { // 預設參數
        $this->x = $y;
    }

    // PHP 5+ 支援解構子
    public function __destruct() {
        // 資源清理(關閉連線、釋放鎖等)
    }
}

$obj = new Something();     // $x = 3
$obj = new Something(8);    // $x = 8
$obj = new Something(8, 9); // 錯誤:參數過多(除非用 func_get_args 處理)

父類建構子不會自動呼叫,子類需显式呼叫:

class Another extends Something {
    public function __construct() {
        $this->y = 5;
        parent::__construct(); // 必須手動呼叫
    }
}

抽象類別與介面

抽象類別

abstract class Base {
    abstract protected function doWork(); // 強制子類實作

    public function templateMethod() {
        // 模板方法模式
        $this->doWork();
    }
}

class Concrete extends Base {
    protected function doWork() { echo "Working..."; }
}
// new Base(); // 錯誤:無法實例化抽象類
$c = new Concrete();
$c->templateMethod();

介面

interface Logger {
    public function log(string $msg);
}

class FileLogger implements Logger {
    public function log(string $msg) { file_put_contents('log.txt', $msg . PHP_EOL, FILE_APPEND); }
}

class DbLogger implements Logger {
    public function log(string $msg) { /* DB 寫入 */ }
}

// 依賴介面而非具體類別
function process(Logger $logger) { $logger->log("Processing..."); }
process(new FileLogger());
process(new DbLogger());

靜態成員與延遲靜態綁定

class Calculator {
    public static $pi = 3.14159;

    public static function add($x, $y) {
        return $x + $y;
    }
}

echo Calculator::$pi;      // 3.14159
echo Calculator::add(3,7); // 10

// 延遲靜態綁定 (PHP 5.3+)
class A {
    public static function who() { echo __CLASS__; }
    public static function test() { static::who(); } // static:: 而非 self::
}
class B extends A {
    public static function who() { echo __CLASS__; }
}
B::test(); // 輸出 "B" (而非 "A")

魔術方法

方法觸發時機
__construct()物件建立
__destruct()物件銷毀
__call($name, $args)呼叫不可見/不存在方法
__callStatic($name, $args)靜態呼叫不可見/不存在方法
__get($name)讀取不可見/不存在屬性
__set($name, $value)寫入不可見/不存在屬性
__isset($name)isset() 檢查不可見屬性
__unset($name)unset() 不可見屬性
__sleep()serialize() 前
__wakeup()unserialize() 後
__toString()物件當字串使用 (echo $obj)
__invoke()物件當函式呼叫 ($obj())
__set_state($arr)var_export() 匯出類別
__clone()clone $obj 後
__debugInfo()var_dump() 時

物件複製與比較

$obj1 = new Something(5);
$obj2 = $obj1;      // 參考賦值:指向同一物件
$obj3 = clone $obj1; // 淺層複製:新物件,屬性值複製(資源/物件屬性仍共享)

// 比較
$obj1 == $obj2; // true:屬性值相同且同類別
$obj1 === $obj2; // true:同一實例
$obj1 === $obj3; // false:不同實例

型別提示與嚴格模式 (PHP 7+)

declare(strict_types=1); // 檔案最頂端

function setX(int $v): void { // 參數型別、回傳型別
    $this->x = $v;
}

// 類別型別提示
function process(Logger $logger): bool { ... }

// 介面型別提示
function save(Persistable $entity): void { ... }

命名空間與自動載入

<?php
namespace App\Models;

use App\Interfaces\Logger;
use Psr\Log\LoggerInterface as PsrLogger;

class User implements Logger {
    // ...
}

// 使用
$user = new \App\Models\User();
$user = new User(); // 同命名空間
$user = new \Psr\Log\LoggerInterface(); // 完整路徑

搭配 Composer PSR-4 自動載入:

// composer.json
{
    "autoload": {
        "psr-4": { "App\\": "src/" }
    }
}

Trait 程式碼複用 (PHP 5.4+)

trait Loggable {
    public function log($msg) { error_log($msg); }
}

class User {
    use Loggable;
}
class Order {
    use Loggable;
}

$user = new User();
$user->log("User logged in"); // 直接使用 trait 方法

匿名類別 (PHP 7+)

$logger = new class implements Logger {
    public function log($msg) { echo "LOG: $msg"; }
};
$logger->log("test");

現代 PHP OOP 最佳實踐清單

  1. 所有屬性宣告可見性 (public/protected/private)。
  2. 使用 __construct() 而非同名方法。
  3. 依賴介面/抽象類,而非具體實作 (DIP)。
  4. 善用 final 防止被繼承/覆寫。
  5. 資源管理用 __destruct() 或實作 Disposable 介面配合 try/finally。
  6. 避免過度繼承,優先組合 (Composition over Inheritance)。
  7. 嚴格型別模式 declare(strict_types=1)。
  8. PSR-1/PSR-12 編碼風格規範。
  9. 單元測試覆蓋核心領域邏輯。

結語

PHP 從早期簡易的 class Something { var $x; } 演進至今,已具備完整的現代 OOP 特性:可見性、抽象類/介面、Trait、靜態綁定、型別提示、命名空間、魔術方法等。掌握這些特性並遵循 SOLID 原則,即能用 PHP 開發出可維護、可擴充、可測試的大型應用系統。

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