Table of Contents
為什麼要學習 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();
在這個例子中,Book
和 Bookshelf
是類別,而 $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);
在這個例子中,Car
和 ParkingLot
是類別,而 $car1
、$car2
和 $myParkingLot
是物件。ParkingLot
物件可以包含多個 Car
物件,展示了物件如何在程式中互動。
最後
在上面的幾個例子中,你已經在不知不覺中學了不少技術和概念:
類別(Class)與物件(Object):
類別是一個模板,用於創建物件。物件則是類別的實例,具有類別定義的屬性和方法。
屬性(Attributes):
這些是存儲在物件內部的變量,用於描述物件的特性,如「書的名稱」或「車的品牌」。
方法(Methods):
這些是物件可以執行的功能或行為,例如「添加書籍到書架」或「汽車啟動」。
封裝(Encapsulation):
這是一種將數據(屬性)和操作數據的方法綁定在一起的技術。這有助於保護數據的完整性。
陣列與物件的組合:
在「書架」和「停車場」的例子中,看到了如何在一個物件(如書架或停車場)中存儲多個其他物件(如書或車)。
物件間的互動:
這些例子也展示了如何讓不同的物件互相交互,例如將「書」物件添加到「書架」物件中。
實例化(Instantiation):
這是創建新物件的過程。像在上面的例子中,使用了 new
關鍵字來實例化類別。
以上基本概念和技術是理解和使用 PHP 物件導向程式設計的基礎。
更多參考資源