物件導向對於初學者來說可能是個較容易混淆的概念。
要搞懂物件導向,首先要釐清類別(class)、屬性(property)、方法(method)、實體(instance)之間的差別及用法。
class是一個藍圖,裡面定義了屬於這個class的物件該有什麼特性和功能。
class ClassName{
public $property1;
private $property2;
private $property3;
function __construct() { //建構子
}
private function methodName1(){
//方法內容
}
public function methodName2(){
//方法內容
}
function __destruct() { //解構子
}
}
property是這個物件應該有的一些變數,property前面的public、private是『 修飾子 』,表示該property的使用權限,這個之後會再詳細介紹。
而method則是一些function,是該物件擁有的功能或動作,建構子和解構子的部份之後會再跟大家細談。
註:有學過其他語言的,可能看過他們在定義funcion前都會加上回傳值的型態,但因為php的變數及函式回傳值都是「泛型」,所以不需要定義回傳值的型態。
在class中定義好了這個物件該有的property、method之後,我們還要將這個class實體化,生成實體(instance)(new一個物件)。
而為了方便初學者理解,我們可以用日常生活中所見到的物件來比喻程式語言中的物件:例如一輛汽車,是一個物件(object)。而這個物件中又包含了它的屬性(property)和功能(method)。
屬性可能包含了車的顏色、大小、可乘載人數等,而功能則是指它能夠前進、煞車等等。
那麼要造出這台車前,我們要先有一個藍圖,這個藍圖就是class。
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";
}
//若我們要使用定義在class中的屬性,前面要加上$this
}
然而,畫出藍圖後,這台車並未真的被造出來。
我們要將這個class『 實體化 』(instantiate),實體化後我們才能開始使用這台車的屬性以及其功能。
$myCar = new Car(); //實體化Car這個class
$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
動態和靜態的意義為,我們可以說前者是具有狀態的;而後者則無。
為何說是有狀態與無狀態呢?由於建立一個物件後,記憶體會分配給這個實體一個空間,裡面能夠儲存關於這個實體的property或method的資訊;靜態的function則可視為是『一次性』的,例如將某兩個傳進來的參數做單純的加減乘除,計算完畢、回傳結果後,這些儲存這些計算過程中的記憶體就會被釋放。諸如此類不需要記錄變數狀態的,就可以用靜態的static function來達成需要的功能。