物件導向對於初學者來說可能是個較容易混淆的概念。
要搞懂物件導向,首先要釐清類別(class)、屬性(property)、方法(method)、實體(instance)之間的差別及用法。
類別(class)是一個藍圖,裡面定義了屬於這個類別的物件該有什麼特性和功能。
class ClassName{
public $property1;
private $property2;
private $property3;
function __construct() { //建構子
}
private function methodName1(){
//方法內容
}
public function methodName2(){
//方法內容
}
function __destruct() { //解構子
}
}
屬性(property)是這個物件應該擁有的一些變數,而屬性前面的 公有(public)、私有(private) 等關鍵字則稱為「修飾子」,用來表示該屬性的使用權限。關於修飾子的詳細說明,之後會再進一步介紹。
而「方法(method)」則是物件擁有的功能或動作,就像一個能執行的函式(function)。至於建構子與解構子的部分,之後也會再詳細說明。
註:若你學過其他程式語言,可能會發現有些語言在定義函式時,會在前面加上「回傳值型態」。但由於 PHP 的變數與函式回傳值皆為「動態型別」,因此不需要在宣告時指定回傳型態。
在類別中定義好物件該有的屬性與方法之後,我們還需要將這個類別「實體化」,也就是建立出一個實際存在的實體(instance)。
為了幫助初學者理解,我們可以用生活中的例子來比喻程式中的物件:
以一輛汽車為例,它就是一個物件。這輛車擁有屬性,例如顏色、大小、可乘載人數等;同時也有功能(方法),例如前進、煞車等。
而在「造出這台車」之前,我們需要先有一張藍圖,那張藍圖就相當於類別(class)。
補充:在 PHP 中,若我們要使用定義在該類別中的方法或屬性,呼叫時要在方法前面加上$this,表示使用此實體的這個方法或屬性。
class Car{
public $color;
public $size;
public $speed = 150;
//上面這三個變數是 Car 這個類別的『屬性』
//而以下這兩個 function 是Car這個類別的『方法』
function outLook($color, $size){
echo "Your car is $color and is $size meters long.\n";
}
function run(){
echo "You can drive the car at most $this->speed km.\n";
}
}
然而,畫出藍圖後,這台車並未真的被造出來。
我們要將這個類別實體化,實體化後我們才能開始使用這台車的屬性以及其功能。
$myCar = new Car(); //實體化Car這個類別
$myCar->run();
//output:You can drive the car at most 150 km.
$myCar->color = 'red';
$myCar->size = 3;
$myCar->outLook($myCar->color, $myCar->size);
//output:Your car is red and is 3 meters long.
補充:在命名類別時,php的慣例是用「大駝峰」式命名,也就是第一個字的字首大寫,而後面每個單字字首也大寫,例如:DriveCar。而命名物件時,php的慣例是用「小駝峰」式命名,第一個字的字首小寫,而後面每個單字字首都要大寫,例如:myCar
「動態」與「靜態」最大的差別,在於是否具有狀態(state)。
所謂「有狀態」,指的是這個物件在被建立之後,系統會在記憶體中為它分配一塊空間,用來儲存與這個實體相關的屬性與方法資料。這些資料會隨著物件的存在而被保留與更新。
相對地,「靜態」的成員(如靜態方法 static function)則是沒有特定物件狀態的。
靜態方法更像是一個工具函式(utility function),它只根據傳入的參數進行計算或處理,執行完後就結束,不會保留任何特定實體的資料。
舉例來說,如果有個方法只是單純負責將兩個數字相加或轉換格式、驗證輸入資料等,這些行為與個別物件狀態無關,就可以設計成 static 靜態方法。
這樣做有以下幾個好處: