物件導向中的Class跟Object分別具有甚麼意義??

甚麼是Class(類別)?

我們可以在Class定義屬於這個Class的物件該有甚麼特性&功能。

案例示範:

案例內的property是這個物件需要有的變數(特性),比如 : 外殼顏色、人數等等。methods則是可以讓物件前進、後退、啟用等等。

下面案例的建構子 __construct 是class中的一種method,只有在實體化一個class後(new完後)能被執行,是用來初始化一些class特性的。解構子 __destruct 則是當對象的生命週期結束時,它會自動地被呼叫執行。它最主要的目的在於,清空並釋放物件先前建立或是佔用的記憶體資源。

class ThisIsACar{
    
    public $color;      
    public $size;
    public $name = "Lisa";
    
    function __construct() { //建構子
            
    }
    public function activate(){
        echo "Hi there!!It's $this->$name 's car\n";     
        //若要使用定義在class中的屬性,前面要加上$this  
        //物件使用 $this 就如同你直接使用物件名稱來指定,所以等於ThisIsACar->$name
    }
    public function outlook(){
        echo "Your car is $this->color and the maximize size is $this->size.";
    }

    function __destruct() { //解構子
            
    }
     
    public static function count(){
       if(n>100){
           echo "too much article";
       }
       else
           echo "it's fine";
 
    
}

順帶一提,在 method 裡使用 $this 有個限制,那就是該 method 不能以 static 的方,由於靜態方法不屬於物件,所以在靜態方法中使用 $this 是沒有意義的;也就是說,以下的執行方式是錯的:

ThisIsACar::activate(); // Fatal error: Using $this when not in object context in xxx.php

甚麼是Object(物件)?

當Class內的特性跟方法都被定義完成後,但這個時候的Class還沒被實體化,所以我們必須new這個Class形成物件。被new後的物件是實體,屬於動態的,狀態會隨時改變,但架構與行為不會改變,因為架構與行為是在Class內被影響。

案例示範 :
$myCar = new ThisIsACar();     //實體化ThisIsACar這個class
$myCar->activate();
//output:Hi there!!
$myCar->color = 'yellow';
$myCar->size = 100;
$myCar->outLook();
//output:Your car is yellow and is 100 meters long.

簡單來說,Class是用來決定Object形成時的樣子,當Object形成時,就會同時形成一個記憶體中的空間,記載著Object活動時暫存的資料與狀態,並且當Class存在時有能力透過Method執行一些動作。

屬性前的Public、Protected、Private是甚麼?有甚麼差別?

可能會有人疑問 property 跟 function 前寫的Public、Protected、Private分別代表甚麼意義?

  • Public、Protected、private關係到 property & function 的被存取權限,也就是可視性。
  • 存取權限從高到低 : public > protected > private。
  • class 中 function 需要加上可視性的關鍵字,如果沒有加上關鍵字,則PHP預設就當他是public的;屬性則必須要加上不然會報錯 ( var 關鍵字宣告的屬性則預設會當做 public )。
  • public可以從object外部被存取,但是protect、private兩者都不行。
  • public和protect的成員都會在繼承的時候繼承到子類別(詳細解釋在php類別內的繼承篇會說明),而private則不會,也就是說如果有一個新的類別繼承了宣告有private property或function的class,新的class以及所有的子類別將沒有辦法使用這些被宣告為private的property或function。

甚麼是static?

static是用來宣告靜態成員,可以用在成員(類別、欄位、方法、屬性、運算子、事件和建構函式)上。

使用靜態成員時機是當我們需要一直使用到這個成員,優點是這個成員若是屬性就可以共享記憶體,若是方法則大家都可以call他。

案例示範 :

我們可以透過::使用靜態方法。下方示範案例的方法皆為Laravel內建的靜態方法。

public function index()
{
        $article = 200;

        return self::count($article);    //count function 在上方有宣告過
                                         //output: too much article
}

特性 :

  1. 在程式運行的最開始就已經占據記憶體。
  2. 不須new就可以使用。
  3. static的成員共享記憶體。
  4. static 靜態成員,概念上隸屬於class;non-static 非靜態成員,概念上隸屬於object。