static 是定義一個靜態對象或靜態變數,關於static 定義的變數或類方法有什麼特性我們看完本文章的相關執行個體後就見分曉了。
1. 建立對象$object = new Class(),然後使用”->”調用:$object->attribute/function,前提是該變數/方法可訪問。
2. 直接調用類方法/變數:class::attribute/function,無論是靜態/非靜態都可以。但是有前提條件:
A. 如果是變數,需要該變數可訪問。
B. 如果是方法,除了該方法可訪問外,還需要滿足:
b1) 如果是靜態方法,沒有特殊條件;
b2) 如果是非靜態方法,需要改方法中沒有使用$this,即沒有調用非靜態變數/方法,當然,調用靜態變數/方法沒有問題。
然後我們再看一下使用$object->… 和使用class::… 都有什麼區別:
1. 使用$object->… ,需要執行建構函式建立對象;
2. 使用class::… 調用靜態方法/變數,不需要執行建構函式建立對象;
3. 使用class::… 調用非靜態方法/變數,也不需要執行建構函式建立對象。
然後奇怪的地方就出來了,既然2和3都一樣,那靜態方法/變數存在還有什麼意義呢?
靜態 static
聲明類成員或方法為 static ,就可以不執行個體化類而直接存取,不能通過一個對象來訪問其中的靜態成員(靜態方法除外)。靜態成員屬於類,不屬於任何對象執行個體,但類的對象執行個體都能共用。
代碼如下:
class Child{ public $name; //這裡定義並初始化一個靜態變數 $nums public static $nums=0; function construct($name){ $this->name=$name; } public function join_game(){ //self::$nums 使用靜態變數 self::$nums+=1; echo $this->name."加入堆雪人遊戲"; } } //建立三個小孩 $child1=new Child("李逵"); $child1->join_game(); $child2=new Child("張飛"); $child2->join_game(); $child3=new Child("唐僧"); $child3->join_game(); //看看有多少人玩遊戲 echo "<br/> 有這".Child::$nums;