甚麼是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
}
特性 :
- 在程式運行的最開始就已經占據記憶體。
- 不須new就可以使用。
- static的成員共享記憶體。
static
靜態成員,概念上隸屬於class;non-static
非靜態成員,概念上隸屬於object。