文章

PHP - OOP (物件導向程式設計) 基礎


課程簡介

物件導向程式設計(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.
  • 使用 $this 指代當前物件。

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:設計一個類別

  1. 設計一個類別 Book,包含書名、作者和價格屬性。
  2. 實作一個方法 getDetails,返回格式化的書籍資訊字串。

練習 2:繼承與方法覆寫

  1. 設計一個基礎類別 Vehicle,包含 move 方法。
  2. 創建子類別 CarBicycle,覆寫 move 方法以輸出不同的移動方式。

練習 3:抽象與介面

  1. 設計一個抽象類別 Shape,定義抽象方法 area
  2. 創建類別 RectangleTriangle,實作 area 方法,計算矩形與三角形面積。

教學重點

  • 了解類別、物件、屬性與方法的基本概念。
  • 掌握封裝、繼承和多型的應用。
  • 熟悉 PHP 中的建構子、訪問修飾符以及抽象類別和介面。

本文章以 CC BY 4.0 授權