---
# System prepended metadata

title: 什麽是（OOP）物件導向程式設計?
tags: [開發架構原則, 開發學習筆記]

---

---
title: '什麽是（OOP）物件導向程式設計原則?'
---

什麽是（OOP）物件導向程式設計原則?
===

物件導向程式設計（Object-Oriented Programming, OOP）是一種程式設計原則，
以物件（Objects）作為核心。在OOP中，物件是具有屬性（Attributes）和方法（Methods）的資料結構。

核心概念
---

1. 類別（Class）：
    - 定義了一個物件的屬性和方法。
    - 可以被視為物件的藍圖或模板。
2. 物件（Object）：
    - 由類別實例化（Instantiated）得到的實體。
    - 每個物件都有自己的屬性值，並共享同一類別的方法。
3. 封裝（Encapsulation）：
    - 將資料（屬性）和操作這些資料的程式碼（方法）包裝在一起。
    - 通常透過存取控制來實現，如public、private和protected關鍵字。
4. 繼承（Inheritance）：
    - 一種類別可以繼承另一個類別的特性的機制。
    - 子類別（Subclass）繼承父類別（Superclass）的屬性和方法。
5. 多型（Polymorphism）：
    - 允許物件採取多種形式。
    - 最常見的形式是透過介面（Interface）或抽象類別（Abstract Class）實現。

### PHP程式範例:
以下是一個簡單的PHP物件導向程式範例：
```php!=
<?php
// 定義類別
class Car {
    // 屬性
    public $color;
    public $model;

    // 建構函數
    public function __construct($color, $model) {
        $this->color = $color;
        $this->model = $model;
    }

    // 方法
    public function carDetails() {
        return "這是一輛 " . $this->color . " 色的 " . $this->model . "。";
    }
}

// 建立物件
$myCar = new Car("紅", "Toyota");

// 輸出物件的詳細資訊
echo $myCar->carDetails();
?>
```
在這個範例中，Car 是一個類別，它有兩個屬性（color 和 model），和一個方法（carDetails）。我們創建了一個 Car 類別的實例 myCar，並調用其方法來獲得車輛的詳細資訊。

解釋 `__construct` 是什麽？
---
在物件導向程式設計（OOP）中，`__construct` 是一個特殊的方法，通常被稱為構造函數，可能還有其它叫法。當一個新的物件被創建時，構造函數會自動被呼叫，通常用於初始化物件的狀態。

在 PHP 中，`__construct` 函數的主要用途包括：

1. 初始化物件屬性：
    - 在物件被創建時設定一些初始值。
    - 例如，為一個類別的屬性分配初始值或執行某些啟動程序。
2. 執行所需的起始設定：
    - 像是資料庫連接、讀取配置文件等。
3. 傳遞參數給物件：
    - 在創建物件的時候，可以通過構造函數傳遞參數，這允許在物件建立時就配置其行為或狀態。
### PHP程式範例:
當不使用 __construct 構造函數時，物件在創建時將不會自動執行初始化操作。
這意味著需要在創建物件後手動設置其屬性。
以下是一個簡單的PHP範例：
```php!=
<?php
// 定義類別
class Car {
    // 屬性
    public $color;
    public $model;

    // 移除建構函數
    // public function __construct($color, $model) {
    //     $this->color = $color;
    //     $this->model = $model;
    // }

    // 方法
    public function carDetails() {
        return "這是一輛 " . $this->color . " 色的 " . $this->model . "。";
    }
}

// 建立物件
$myCar = new Car();

// 手動設置屬性
$myCar->color = "紅";
$myCar->model = "Toyota";

// 輸出物件的詳細資訊
echo $myCar->carDetails();
?>
```
在這個修改後的範例中，Car 類別不再有一個自動設置 color 和 model 屬性的建構函數。相反，我們在創建了 Car 類的實例後，需要手動設置這些屬性。

如果不手動設置這些屬性，則試圖訪問它們將返回 null，因為它在物件創建時沒有被初始化。還有可能導致程式中出現錯誤或意料之外的事情。

總結
---
OOP 帶來一些優點:
- 讓我們在開發上可以將功能劃分成獨立的模塊（類別和物件），這有助於構建複雜的程式碼。
- 封裝隱藏了物件的內部細節，只公開必要的接口，這降低了程式各部分之間的相互依賴性。
- 易於理解和協作
- 物件導向程式設計允許開發者在不修改現有程式碼的情況下，透過擴展（如添加新的類別或方法）來增加新功能。

雖然 OOP 有許多優點，但它也不是萬能的， 對於某些類型的問題，可能還是需要使用其他程式設計原則。

參考資料:
---
- [面向对象是什么鬼（OOP）](https://blog.csdn.net/q932104843/article/details/52298565)