PHP 物件導向的基礎,從類別 (Class) 與物件 (Object) 開始

woman in black and white floral long sleeve shirt sitting at the table

為什麼要學習 PHP 物件導向

學習 PHP 物件導向程式設計(Object-Oriented Programming,OOP)有多個好處,以下是一些主要的理由:

1. 組織和結構

物件導向允許你將相關的功能和數據組合在一起,形成一個獨立的「物件」。這使得程式碼更容易組織和管理。

2. 重用程式

一個良好設計的類別可以在多個項目中重用,減少重複的程式碼和提高開發效率。

3. 易於維護

由於物件導向程式設計強調模組化和封裝,因此更容易進行維護和擴展。當需求變更時,你只需修改相關的類別或物件,而不必改變整個程式碼基礎。

4. 提高協作效率

在大型項目中,多個開發人員可以同時工作於不同的類別或物件,這樣可以提高協作效率。

5. 更好的資料安全性

物件導向允許你通過封裝來保護數據,只暴露必要的接口,這有助於提高資料的安全性。

6. 更接近自然世界的模型

物件導向程式設計是一種更接近自然世界的思維模式。在自然界中,每個物體都有其屬性(例如,人有名字、年齡等)和行為(例如,人可以走、跑、說話等)。這使得物件導向程式設計更容易理解和應用。

7. 設計模式

物件導向程式設計有一套成熟的設計模式,這些模式是解決常見問題的最佳實踐,學習它們可以提高你的開發技巧。

物件導向程式設計是一種強大而靈活的編程範式,它有助於提高程式碼的質量、可維護性和可重用性。因此,學習物件導向程式設計是非常有價值的。

什麼是 (Class) 與物件 (Object)

物件導向程式設計就像是玩積木。每一塊積木(稱之為「物件」)都有自己的特點,比如顏色和大小。這些積木是根據一個模板(稱之為「類別」)來製作的。

想像你有一個車子的模板,你可以用這個模板來製作很多不同顏色和品牌的車子積木。每一輛車子都能「跑」和「停」,這些是車子應該有的功能。

現在,假設你要建一個停車場來放所有的車子積木。停車場也是一個模板,它告訴我們這裡可以停多少輛車,而且可以讓車子進出。

當你用這些模板製作出真正的積木和停車場後,你就可以開始玩了。你可以讓車子進停車場,或者讓它們在路上跑。

這樣,如果你想改變某個車子的顏色或者讓更多的車子進停車場,你只需要改變相對應的積木或停車場,而不需要重新建造整個世界。

這就是物件導向程式設計的好處:它讓我們更容易地組織和管理「積木世界」,並且可以很容易地添加或更改東西。

從實際程式範例中理解

A piece of cake

在物件導向程式設計(OOP)中,類別(Class)就像是一個藍圖或模板。它定義了一個物件的基本結構和功能。

Class(類別)

想像現在有一個蛋糕的食譜:食譜會告訴你需要哪些成分(屬性)和如何製作蛋糕(方法)。

在 PHP 中,你會這樣定義一個類別:

class Cake {
  // 屬性
  public $flavor;
  public $size;

  // 方法
  public function bake() {
    echo "Baking the " . $this->flavor . " cake.";
  }
}

Object(物件)

物件(Object)則是根據類別(Class)所創建的實例。如果類別是食譜,那麼物件就是根據那個食譜所製作出來的實際蛋糕。

$chocolateCake = new Cake();
$chocolateCake->flavor = "chocolate";
$chocolateCake->size = "large";

這裡,$chocolateCake 就是一個由 Cake 類別創建的物件。我們給它設定了 “chocolate” 的口味和 “large” 的尺寸。

然後,可以使用這個物件的方法:

$chocolateCake->bake();  // 輸出:Baking the chocolate cake.

Books are a uniquely portable magic.

現在用一個書籍(Book)和書架(Bookshelf)的例子來進一步解釋 “class” 和 “object”。

Class(類別)

假設我們要設計一個書籍(Book)的類別。這個類別會有一些屬性,如書名(title)和作者(author),以及一些方法,如閱讀(read)。

在 PHP 中,這個類別可能會像這樣:

class Book {
  // 屬性
  public $title;
  public $author;

  // 方法
  public function read() {
    echo "Reading " . $this->title . " by " . $this->author;
  }
}

Object(物件)

接著,可以根據這個 Book 類別來創建不同的書籍(Book)物件。比如,可以創建一本名為 “Harry Potter” 的書,作者是 “J.K. Rowling”。

$book1 = new Book();
$book1->title = "Harry Potter";
$book1->author = "J.K. Rowling";

這樣,$book1 就是一個根據 Book 類別創建的物件。可以對它進行各種操作,比如讀這本書:

$book1->read();  // 輸出:Reading Harry Potter by J.K. Rowling

在這個例子中,Book 是一個類別,它定義了所有書籍應有的基本特性和功能。而 $book1 是一個物件,它是 Book 類別的一個實例,具有特定的書名和作者。

類別:書架(Bookshelf)

想像一個可以放多本書的書架。Bookshelf 類別可以有一個屬性,這個屬性是一個由 Book 物件組成的陣列。它還可以有方法來添加或移除書籍。

在 PHP 中,你可能會這樣定義一個 Bookshelf 類別:

class Bookshelf {
  // 屬性
  public $books = [];

  // 方法:將一本書添加到書架上
  public function addBook($book) {
    array_push($this->books, $book);
    echo "已將 " . $book->title . " 添加到書架上。\n";
  }

  // 方法:列出書架上所有的書
  public function listBooks() {
    echo "書架上的書籍:\n";
    foreach ($this->books as $book) {
      echo $book->title . " 由 " . $book->author . " 寫作\n";
    }
  }
}

物件:將 Book 和 Bookshelf 結合使用

現在,來創建一些 Book 物件和一個 Bookshelf 物件:
類別是一種抽象的概念,用於定義物件應有的屬性和方法;物件則是這些概念的具體實現。

// 創建 Book 物件
$book1 = new Book();
$book1->title = "哈利波特";
$book1->author = "J.K. 羅琳";

$book2 = new Book();
$book2->title = "哈比人";
$book2->author = "J.R.R. 托爾金";

// 創建一個 Bookshelf 物件
$myBookshelf = new Bookshelf();

// 將書添加到書架上
$myBookshelf->addBook($book1);
$myBookshelf->addBook($book2);

// 列出書架上的書
$myBookshelf->listBooks();

在這個例子中,BookBookshelf 是類別,而 $book1$book2$myBookshelf 是物件。Bookshelf 物件可以包含多個 Book 物件,這展示了在一個程式中物件如何互相交互。

Life is too short for traffic

這次用一個「汽車(Car)」和「停車場(ParkingLot)」的例子來解釋 “class” 和 “object”。

類別:汽車(Car)

假設我們要設計一個汽車(Car)的類別。這個類別會有一些屬性,如品牌(brand)和顏色(color),以及一些方法,如啟動(start)和停車(park)。

在 PHP 中,這個類別可能會像這樣:

class Car {
  // 屬性
  public $brand;
  public $color;

  // 方法
  public function start() {
    echo "啟動 " . $this->brand . " 汽車。\n";
  }

  public function park() {
    echo $this->brand . " 已停車。\n";
  }
}

類別:停車場(ParkingLot)

停車場(ParkingLot)是一個可以停多輛汽車的地方。這個類別會有一個屬性,即一個由 Car 物件組成的陣列,以及一個方法來添加汽車。

class ParkingLot {
  // 屬性
  public $cars = [];

  // 方法:將一輛汽車添加到停車場
  public function addCar($car) {
    array_push($this->cars, $car);
    echo "已將 " . $car->brand . " 添加到停車場。\n";
  }
}

物件:使用 Car 和 ParkingLot

現在,可以創建一些 Car 物件和一個 ParkingLot 物件:

// 創建 Car 物件
$car1 = new Car();
$car1->brand = "Toyota";
$car1->color = "紅色";

$car2 = new Car();
$car2->brand = "BMW";
$car2->color = "黑色";

// 創建一個 ParkingLot 物件
$myParkingLot = new ParkingLot();

// 將汽車添加到停車場
$myParkingLot->addCar($car1);
$myParkingLot->addCar($car2);

在這個例子中,CarParkingLot 是類別,而 $car1$car2$myParkingLot 是物件。ParkingLot 物件可以包含多個 Car 物件,展示了物件如何在程式中互動。

最後

在上面的幾個例子中,你已經在不知不覺中學了不少技術和概念:

類別(Class)與物件(Object)

類別是一個模板,用於創建物件。物件則是類別的實例,具有類別定義的屬性和方法。

屬性(Attributes)

這些是存儲在物件內部的變量,用於描述物件的特性,如「書的名稱」或「車的品牌」。

方法(Methods)

這些是物件可以執行的功能或行為,例如「添加書籍到書架」或「汽車啟動」。

封裝(Encapsulation)

這是一種將數據(屬性)和操作數據的方法綁定在一起的技術。這有助於保護數據的完整性。

陣列與物件的組合

在「書架」和「停車場」的例子中,看到了如何在一個物件(如書架或停車場)中存儲多個其他物件(如書或車)。

物件間的互動

這些例子也展示了如何讓不同的物件互相交互,例如將「書」物件添加到「書架」物件中。

實例化(Instantiation)

這是創建新物件的過程。像在上面的例子中,使用了 new 關鍵字來實例化類別。

以上基本概念和技術是理解和使用 PHP 物件導向程式設計的基礎。


更多參考資源

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *