課程簡介
物件導向程式設計(Object-Oriented Programming, OOP)是 PHP 的核心編程範式之一,透過封裝、繼承和多型來提高程式的可讀性和重用性。在本課程中,我們將介紹 OOP 的基本概念,並示範如何在 PHP 中使用物件導向技術設計應用程式。
什麼是 OOP?
OOP 是一種基於「物件」的程式設計方式,其核心理念包括:
- 封裝(Encapsulation):將資料與行為封裝在物件中,減少外部依賴。
- 繼承(Inheritance):通過繼承共享代碼,提升重用性。
- 多型(Polymorphism):以相同介面操作不同型別的物件。
PHP 中的 OOP 基礎
1. 類別與物件
定義類別
1
2
3
4
5
6
7
8
| class Car {
public $brand;
public $color;
public function drive() {
echo "The car is driving.";
}
}
|
建立物件
1
2
3
4
5
6
| $car = new Car();
$car->brand = "Toyota";
$car->color = "Red";
echo $car->brand; // Toyota
$car->drive(); // The car is driving.
|
2. 屬性與方法
1
2
3
4
5
6
7
8
9
10
11
| class Dog {
public $name;
public function bark() {
echo "{$this->name} is barking.";
}
}
$dog = new Dog();
$dog->name = "Buddy";
$dog->bark(); // Buddy is barking.
|
3. 建構子與解構子
- 建構子(Constructor):物件建立時自動執行,用於初始化物件。
- 解構子(Destructor):物件釋放時自動執行,用於資源釋放。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Person {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function __destruct() {
echo "{$this->name} is being destroyed.";
}
}
$person = new Person("Alice");
echo $person->name; // Alice
|
4. 訪問控制修飾符
public
:可被任何地方訪問。protected
:僅限類別內部或繼承類別訪問。private
:僅限類別內部訪問。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Account {
private $balance;
public function __construct($balance) {
$this->balance = $balance;
}
public function getBalance() {
return $this->balance;
}
}
$account = new Account(100);
echo $account->getBalance(); // 100
|
5. 繼承
定義繼承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Animal {
public function eat() {
echo "This animal is eating.";
}
}
class Dog extends Animal {
public function bark() {
echo "This dog is barking.";
}
}
$dog = new Dog();
$dog->eat(); // This animal is eating.
$dog->bark(); // This dog is barking.
|
方法重寫(Override)
子類別可覆寫父類別的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| class Animal {
public function sound() {
echo "This animal makes a sound.";
}
}
class Cat extends Animal {
public function sound() {
echo "Meow!";
}
}
$cat = new Cat();
$cat->sound(); // Meow!
|
6. 抽象類別與介面
抽象類別
- 無法直接實例化,需由子類別實作。
```php abstract class Shape { abstract public function area(); }
class Circle extends Shape { private $radius;
1
2
3
4
5
6
7
| public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return pi() * $this->radius ** 2;
} }
|
$circle = new Circle(5); echo $circle->area(); // 78.539816339745
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#### 介面
- 定義方法簽名,要求實作類別實現其方法。
```php
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
echo "Logging to file: $message";
}
}
$logger = new FileLogger();
$logger->log("System error!"); // Logging to file: System error!
|
7. 多型
透過介面或繼承實現多型:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| class Bird {
public function fly() {
echo "This bird is flying.";
}
}
class Penguin extends Bird {
public function fly() {
echo "Penguins cannot fly.";
}
}
function makeFly(Bird $bird) {
$bird->fly();
}
$bird = new Bird();
$penguin = new Penguin();
makeFly($bird); // This bird is flying.
makeFly($penguin); // Penguins cannot fly.
|
教學練習
練習 1:設計一個類別
- 設計一個類別
Book
,包含書名、作者和價格屬性。 - 實作一個方法
getDetails
,返回格式化的書籍資訊字串。
練習 2:繼承與方法覆寫
- 設計一個基礎類別
Vehicle
,包含 move
方法。 - 創建子類別
Car
和 Bicycle
,覆寫 move
方法以輸出不同的移動方式。
練習 3:抽象與介面
- 設計一個抽象類別
Shape
,定義抽象方法 area
。 - 創建類別
Rectangle
與 Triangle
,實作 area
方法,計算矩形與三角形面積。
教學重點
- 了解類別、物件、屬性與方法的基本概念。
- 掌握封裝、繼承和多型的應用。
- 熟悉 PHP 中的建構子、訪問修飾符以及抽象類別和介面。