文章

PHP - OOP 進階應用


課程簡介

本課程將深入探討物件導向程式設計(OOP)的進階概念,包括靜態方法與屬性、命名空間、Trait、多型的實際應用,以及設計模式的簡介,幫助您設計更具模組化與彈性的 PHP 應用程式。


靜態方法與屬性

靜態(Static)屬性與方法不需要實例化類別即可使用,適合用於全域工具類別或狀態管理。

1. 靜態屬性

使用 static 關鍵字定義,並用 self:: 訪問。

1
2
3
4
5
6
7
8
9
10
11
class Counter {
    public static $count = 0;

    public static function increment() {
        self::$count++;
    }
}

Counter::increment();
Counter::increment();
echo Counter::$count; // 2

2. 靜態方法

靜態方法適用於不依賴物件狀態的功能。

1
2
3
4
5
6
7
class Math {
    public static function add($a, $b) {
        return $a + $b;
    }
}

echo Math::add(5, 3); // 8

命名空間(Namespace)

命名空間用於避免類別名衝突,適合大型專案或套件開發。

定義與使用命名空間

1
2
3
4
5
6
7
namespace MyApp\Utils;

class Logger {
    public function log($message) {
        echo "Log: $message";
    }
}

引入與使用

1
2
3
4
5
6
require_once 'Logger.php';

use MyApp\Utils\Logger;

$logger = new Logger();
$logger->log("This is a message.");
  • 使用 use 簡化命名空間的引用。

Trait

PHP 的 Trait 提供了一種代碼重用的機制,解決多重繼承的限制。

定義 Trait

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
trait Logger {
    public function log($message) {
        echo "Logging: $message";
    }
}

class FileHandler {
    use Logger;

    public function save($data) {
        $this->log("Saving data");
        // 實際保存操作
    }
}

$fileHandler = new FileHandler();
$fileHandler->save("Some data");
// Logging: Saving data

多型應用

多型讓不同類別可以透過相同的介面進行操作,增強程式的靈活性。

範例:支付系統

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
interface PaymentMethod {
    public function pay($amount);
}

class CreditCard implements PaymentMethod {
    public function pay($amount) {
        echo "Paying $amount using Credit Card.";
    }
}

class PayPal implements PaymentMethod {
    public function pay($amount) {
        echo "Paying $amount using PayPal.";
    }
}

function processPayment(PaymentMethod $method, $amount) {
    $method->pay($amount);
}

$creditCard = new CreditCard();
$payPal = new PayPal();

processPayment($creditCard, 100); // Paying 100 using Credit Card.
processPayment($payPal, 200);    // Paying 200 using PayPal.

設計模式簡介

設計模式是解決常見程式設計問題的最佳實踐。以下是幾個基礎模式的介紹:

1. 單例模式(Singleton)

確保一個類別只有一個實例,並提供全域訪問點。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Singleton {
    private static $instance;

    private function __construct() {}

    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

$instance = Singleton::getInstance();

2. 工廠模式(Factory)

用於建立物件而不指定具體類別名稱。

1
2
3
4
5
6
7
8
9
10
class ShapeFactory {
    public static function create($type) {
        switch ($type) {
            case 'circle':
                return new Circle();
            case 'rectangle':
                return new Rectangle();
        }
    }
}

3. 策略模式(Strategy)

定義一系列演算法,並使它們可以互相替換。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
interface SortStrategy {
    public function sort(array $data);
}

class QuickSort implements SortStrategy {
    public function sort(array $data) {
        sort($data);
        return $data;
    }
}

class BubbleSort implements SortStrategy {
    public function sort(array $data) {
        // 實現泡沫排序邏輯
        return $data;
    }
}

class Sorter {
    private $strategy;

    public function __construct(SortStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function sortData(array $data) {
        return $this->strategy->sort($data);
    }
}

$sorter = new Sorter(new QuickSort());
$sorted = $sorter->sortData([5, 3, 8, 1]);

教學練習

練習 1:靜態方法與屬性

  1. 實作一個靜態類別 Config,存儲應用程式的全域配置資訊,並提供存取方法。

練習 2:命名空間

  1. 定義兩個不同命名空間的類別 User,分別代表前端使用者與後端管理員,並在程式中正確引用。

練習 3:Trait

  1. 設計一個 Trait Timestamps,為物件提供創建與更新時間的記錄功能,並將其應用於多個類別中。

練習 4:策略模式

  1. 建立一個策略模式的範例,模擬不同的郵件發送服務(如 SMTP 和 API)。

教學重點

  • 掌握靜態屬性與方法的應用場景。
  • 理解命名空間與 Trait 的作用與用法。
  • 透過設計模式提升程式的可讀性與擴展性。
  • 深入理解多型的實際應用場景。

需要補充更具挑戰性的範例或其他進階設計模式的介紹嗎?

本文章以 CC BY 4.0 授權