Php靜態變量和方法

靜態變量
1.靜態變量是隻存在於作用域的變量,不過,在函數執行完成以後,這種變量的值不會丟失,也就是說,在下一次調用這個函數時,變量仍會記得原來的值
2.將表達式計算出來的結果付給靜態變量是不合法的。表達式是指自身的值會發生變化的任何語句,例如(1+1),$variable,anyfunc()都是表達式
3.你也許會想,定義靜態變量似乎並不是很有用,因爲可以用全局變量輕鬆地獲取同樣的結果。然而,全局變量可以被所有函數訪問,所以如果兩個或者更多本來應該是獨立的函數使用了相同名稱的變量,就會導致衝突;並且,比起引入全局變量,使用靜態變量也不需要更多的語法。因此,在只有一個函數需要訪問某個變量時,我們應該優先使用靜態變量,而不是全局變量

類中靜態元素的使用
4.在類中,static關鍵字有兩種主要的用法,一種是用來定義靜態成員,另一種是用來定義靜態方法。
5.靜態成員是一種類變量,可以把它看成是屬於整個類而不是屬於類的某個實例。與一般的實例變量不同的是,靜態成員只保留一個變量值,而這個變量值對所有的實例都是有效

的,也就是說,所有的實例共享這個成員。
6.$this只表示當前類的實例,self::表示類本身(後面加$)
7.作用域限定操作符::
通過作用域限定操作符,我們可以使用兩個系統定義的作用域:self和parent。此外,php5.3還提供了static作用域。

self表示的是當前類的作用域,不過與$this不同的是,它不表示類的某個特定的實例。
在類之外的代碼中不能使用這個操作符,而且它不能識別自己在繼承樹層次結構中的位置。也就是說,在擴展類中使用self作用域時,self可以調用基類中聲明的方法,但它調用的總是已經在擴展類中重寫的方法。(相當於java中方法的覆蓋,明確調用父類的方法用parent)

重寫父類的靜態變量就在子類中定義一樣的靜態變量

<?php
class aaa
{
  function bbb(){
  echo '用雙冒號::調用類的方法!';
  }
}

調用1:
$a = new aaa();
$a->bbb();

調用2:
aaa::bbb();
?> 
兩種方法得到的結果是一樣的.

想不明白,爲什麼普通方法bbb也可以直接用類名::調用,這好像和java裏面的不一樣
Test.java
class Test{

//普通方法
public  void eat(){
  System.out.println("no-static!");
}

//靜態方法
public static void show(){
  System.out.println("static!");
}

//main方法
public static void main(String args[]){

  Test obj=new Test();
  obj.eat();//輸出no-static!
  obj.show();//方法屬於類,類的實例當然也能訪問,但是eclipse等編輯器中會黃色提示建議用類名直接調用
      //(The static method show() from the type Test should be accessed in a static way)
 
  Test.show();//輸出static
  //Test.eat();//報錯 無法從靜態上下文中引用非靜態 方法 eat()  php卻可以忍受。。。
}
}

個人理解:只要被調用的普通方法裏不出現$this->xx ($this只表示當前類的實例),普通方法也可以認爲是直接屬於類的,所以可以直接用類名調用,而不像java中方法必須要聲明爲static才能用類名直接調用  (php6在靜態方法的操作方面做了幾處修改,首先在訪問非靜態方法時,不再使用::操作符!這種方式要被幹掉了吧。。。)


幫助父類調用子類的方法
php5.3中提出的static::作用域使我們不再需要使用self::和parent::。當希望指向最終的實現類時,就可以使用static::,這個限定符會在代碼執行之前立即計算出繼承層次結構上最後那個類的成員。這一過程被稱爲延遲綁定。

好像沒看出有什麼用,直接在父類中new那個最終實現類的對象然後調用不就行了嗎?但是如果你不知道那個最終類叫什麼,覆蓋

的方法實現了什麼樣的效果,這時候似乎就有用了。static::作用域也可以應用在靜態方法上,這樣從父類可以靜態的調用子類的方法。

發佈了15 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章