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:靜態方法與屬性
- 實作一個靜態類別
Config
,存儲應用程式的全域配置資訊,並提供存取方法。
練習 2:命名空間
- 定義兩個不同命名空間的類別
User
,分別代表前端使用者與後端管理員,並在程式中正確引用。
練習 3:Trait
- 設計一個 Trait
Timestamps
,為物件提供創建與更新時間的記錄功能,並將其應用於多個類別中。
練習 4:策略模式
- 建立一個策略模式的範例,模擬不同的郵件發送服務(如 SMTP 和 API)。
教學重點
- 掌握靜態屬性與方法的應用場景。
- 理解命名空間與 Trait 的作用與用法。
- 透過設計模式提升程式的可讀性與擴展性。
- 深入理解多型的實際應用場景。
需要補充更具挑戰性的範例或其他進階設計模式的介紹嗎?
本文章以 CC BY 4.0 授權