1. 程式人生 > >靜態方法裡不能使用$this標識呼叫靜態方法

靜態方法裡不能使用$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中 所有全域性變數都儲存於靜態記憶體區(但他們並不是靜態變數)。

普通區域性變數,一旦函式執行完畢就銷燬,但是靜態變數不會(區域性變數,離開函式後就銷燬了)。


靜態類屬性就更牛了,不光不會銷燬,還可以被其他區域性環境所呼叫。(靜態變數雖然沒有銷燬,但是隻能在定義它