iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
Software Development

後端基礎PHP+Mysql & Laravel 30日養成計畫系列 第 11

Day 11 淺談物件導向 (一):方法與類別

  • 分享至 

  • xImage
  •  

物件導向對於初學者來說可能是個較容易混淆的概念。
要搞懂物件導向,首先要釐清類別(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 靜態方法。

這樣做有以下幾個好處:

  1. 不需建立物件即可直接使用(節省記憶體)
  2. 程式語意上更清楚,表示這個功能與物件狀態無關
  3. 在多個地方共用時也更方便。

上一篇
Day 10 不能不會的vim
下一篇
Day 12 淺談物件導向(二):修飾子、建構子
系列文
後端基礎PHP+Mysql & Laravel 30日養成計畫35
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言