前言
PHP 過去在物件導向的實現上有許多的缺陷以及令人詬病的地方,
然而自從 2015 年推出了 PHP 7 、以及 2020 年推出 PHP 8 以後,
PHP 已經擺脫了過去的陰霾,不但效能提升許多,也成為了一個相當完整可靠的物件導向程式語言。
經過多年的發展,目前許多流行的 PHP 框架遵循著物件導向的概念,
這些框架充分地利用 PHP 在 OOP 上的特性,設計出許多優良的機制,
讓工程師們可以更快速地開發出符合市場需求的系統。
本系列希望能夠一步一步講解物件導向的概念,
希望讀者最後能夠理解複雜的物件導向程式碼,
並可以自行設計出良好的程式。
定義類別
類別是物件導向的出發點,甚至可以說沒有類別就不會有物件導向。
那什麼是類別呢?類別的定義是一群資料與行為的結合,
聽起來好像有點抽象,但別擔心,先別深究,稍微放在心上就好,我們不會一開始就講得太複雜。
總之,我們先來創造一個簡單的類別,
在 PHP 中定義類別相當的簡單,像下面這樣短短幾行,就完成了一個最基本的類別的定義:
class Student {
}
沒錯,上面這段程式代表我們已經成功定義了一個叫做 Student
的類別了,很輕鬆吧。
我們先來解讀一下這段程式,class
是 PHP 中保留的關鍵字(Reserved Words),用來定義類別的,
在 class
後面會緊接著類別名稱,也就是範例中所看到的 Student
,
整句話合在一起看就是:定義一個叫做 Student
的類別。
Class 的中文我使用「類別」 ,在本系列文章會交替使用類別及 Class 。
建立物件
有了類別後,下一步就是建立物件。這個物件就是物件導向中的物件。
建立物件我們會使用 new
這個關鍵字,我們來試著用 new
幫 Student
建立物件:
$student = new Student();
透過 new
這個關鍵字,我們建立了一個 Student
物件,
並且把這個物件存放到變數 $student
中,
因此現在變數 $student
就是一個 Student
的物件。
我們每次執行 new
後,PHP 都會建立一個全新的物件,
所以我們可以一直建立新物件,每個物件都是獨立的個體:
$student1 = new Student();
$student2 = new Student();
這樣我們就建立了兩個 Student 物件,在物件導向中,我們經常會使用同個類別建立出許多物件。
Object 的中文我使用「物件」 ,在本系列文章會交替使用物件及 Object 。
屬性
還記得前面提到的類別定義嗎?類別是一群資料與行為的結合,
而那些在類別中的資料,我們會給一個特別的名字:屬性。
每個物件都可以儲存自己所需的資料,
而這些被儲存起來的資料稱為屬性 (property),它們其實就是一般的變數,只是藏在每個物件中。
我們可以簡單地透過箭頭 ->
把資料放到物件的屬性中,像是這樣:
$student1 = new Student();
$student1->name = 'Jack';
$student2 = new Student();
$student2->name = 'Annie';
也可以透過箭頭 ->
把指定的屬性取出,並印出值:
echo $student1->name; // output: Jack
echo $student2->name; // output: Annie
這邊有一個重要的觀念要提醒一下,
前面有提到, new
每次都會產生一個新物件,
所以 $student1
跟 $student2
的 name
是獨立的,
在之後的文章會提到例外狀況,所以請特別留意這個現象哦。
->
又稱為object operator
,可以用來取得物件的變數,在之後的文章中,也會被用來呼叫物件的函式。
類別跟物件的差別
類別跟物件是很多人都容易搞混的點,要解釋起來好像也不是那麼容易。
在剛開始學習 PHP 物件導向的時候,可以先把類別想像成工廠裡的模具,我們將原料灌入模具後,就可以製成一個一個的成品,每個成品雖然都長得一模一樣,但是其實都是各自獨立的個體。
然後我們可以針對每個成品進行不一樣的加工,讓它們變的有點不一樣。它們雖然長得有點不一樣,但其實本質上都還是一樣的東西。
至於我們要怎麼加工物件,就讓我們繼續看一下去吧。
補充
另外我們習慣將類別名稱使用大寫駝峰式的方式命名,所以 S 會大寫,
其他如:HighSchoolStudent、FemaleStudent 這樣的命名方式,也都是大寫駝峰式。