靜態方法裡不能使用$this標識呼叫靜態方法
# 概述
static關鍵字宣告一個屬性或方法是和類相關的,而不是和類的某個特定的例項相關,因此,這類屬性或方法也稱為"類屬性"或"類方法"
# 靜態屬性
靜態屬性不可以由物件通過 -> 操作符來訪問。
# 靜態方法裡不能使用$this標識呼叫靜態方法
靜態方法是屬於類的,被每個類的例項所共享。由於靜態方法不需要通過物件即可呼叫,所以偽變數 $this 在靜態方法中不可用。
靜態方法隨著類的載入而載入,靜態方法是優先於物件而存在的。當我們載入一個類的時候,物件還沒有存在,而this代表的是物件的引用,試問當我們載入類的時候物件都沒有,又怎麼可以使用this呢?答案顯而易見
this是指當前物件(相當於一個控制代碼),靜態方法是通過類呼叫的方法,不需要例項化,既然不需要例項化,就沒有當前物件,既然沒有當前物件,就不會有this
# 普通方法呼叫靜態方法
```
$this
self
parent
```
# 靜態方法調動成員
靜態方法不能呼叫非靜態屬性 。不能使用self::呼叫非靜態屬性。
但是可以呼叫不含$this標識的非靜態方法。
````
// 實現最大值比較的Math類。
class Math
{
public function Max($num1, $num2) {
return $num1 > $num2 ? $num1 : $num2;
}
public static function Max3($num1, $num2, $num3) {
$num1 = self::Max($num1, $num2);
$num2 = self::Max($num2, $num3);
$num1 = self::Max($num1, $num2);
return $num1;
}
}
```
> 當一個類中有非靜態方法被self:: 呼叫時,系統會自動將這個方法轉換為靜態方法。
# 總結:
在PHP中 所有全域性變數都儲存於靜態記憶體區(但他們並不是靜態變數)。
普通區域性變數,一旦函式執行完畢就銷燬,但是靜態變數不會(區域性變數,離開函式後就銷燬了)。
靜態類屬性就更牛了,不光不會銷燬,還可以被其他區域性環境所呼叫。(靜態變數雖然沒有銷燬,但是隻能在定義它