final關鍵詞 static靜態屬性和靜態方法
現在有如下需求:
我寫了一個類,你只可以使用,不可以繼承,也不能重寫其中的方法,如果實現?
類或者方法一旦宣告final關鍵詞,那麼此類會有如下特點:
帶有final關鍵詞的類,不能被繼承。
帶有final關鍵詞的方法,不能被子類重寫。
finale關鍵詞宣告類,無法繼承。
1 final class a{ 2 3 }class b extends a{ 4 public function aa(){ 5 echo 'aaa'; 6 }}$aa = new b();//報錯,不可以繼承,因為類宣告不可繼承
即便能繼承,如果父類中有方法帶有final關鍵詞,只允許呼叫,無法重寫此方法。
1 class A{ 2 final public function aaa(){ 3 echo 'aaaa'; 4 } 5 }class B extends A{ 6 7 public function aaa(){ 8 echo 'AAAAaaa'; 9 } public function bbb(){ 10 echo "bbbb"; 11 } 12 13 }//如果重寫帶有final關鍵詞的方法,會報錯。 14 $aa = new B(); 15 //不重寫不會報錯,歡迎呼叫 16 $aa->bbb(); 17 $aa->aaa();
靜態屬性和靜態方法
問:為什麼要例項化物件? 答 : 因為我們需要豐富多彩 , 各具特色的物件。
回顧類與物件的關係 每個物件都有 N 種屬性 , 如 age,name,height,gender等等 屬性值也各不相
同。
問 : 如果某個類 , 沒有屬性 , 即使例項化物件 , 物件之間有差異嗎 ? 答 : 沒有
問 : 那我們有什麼必要再造物件 ? 答 : 沒必要
問 : 如果沒有物件 , 我們怎麼呼叫相關方法呢 ? 答 : 宣告為靜態方法 , 通過類名來呼叫
因為我們定義了很多屬性,才導致我們呼叫的時候形形色色,是屬性在控制例項化出來的物件各有各
的特點。
想一下我們的記憶體,裡面沒有屬性,只有一個方法名字,那不管怎麼去例項化,都是一樣的。
再比如說,我們貌似每個人只有一個頭,那在記憶體中,每一個記憶體塊都是$head=1,相當的浪費內
存。
然後想到我們的類,都需要進行例項化再呼叫,有沒有一種方法可以直接呼叫。
原始寫法如下:
1 //加法運算 2 class Math{ 3 public function add($a,$b){ 4 return $a+$b; 5 }}$math = new Math(); 6 echo $math->add(2,3);
那如何宣告靜態屬性和方法,達到我們節省記憶體的目的。
靜態屬性和靜態方法語法:
1 //在屬性或者方法前面加關鍵詞static關鍵詞,即為靜態屬性和靜態方法 2 class Math{ 3 //宣告一個屬性為屬性屬性 4 static public $name = 'lisi'; 5 6 //宣告一個方法為靜態方法,加關鍵詞static。 7 static public function add($a,$b){ 8 return $a+$b; 9 }}//$ma = new Math(); 10 //去掉物件的$,用類名:: 的方式呼叫靜態方法 11 echo Math::add(2,3); 12 //去掉物件的$,用類名:: 的方式呼叫靜態屬性,注意,靜態屬性需要加$符號 13 echo Math::$name;
如果我想在內部使用靜態的,怎麼做?
1 <?php 2 class A{ 3 public $name = '腳丫太臭了'; 4 5 //定義靜態屬性$age 6 static public $age= 18; 7 8 //定義靜態方法say 9 static public function say(){ 10 echo '我是被靜態修飾的方法'; 11 12 //靜態的和常規的不能混合。 13 //echo $this->age; 14 //echo A::$name; 15 16 echo A::$name; 17 } } $a = new A; 18 //呼叫常規的name屬性 19 echo $a->name; 20 //呼叫靜態的age屬性 21 echo A::$age; 22 23 //訪問靜態的方法 24 A::say();
注意:
1. 可以修改屬性和方法 不能修飾類
2. 靜態的成員需要使用範圍操作符來訪問
A::name 如 果 你 訪 問 的 是 靜 態 屬 性 一 定 要 加 上
A::say();
3. 靜態的成員方法裡不能出現非靜態內容 $this和非靜態的成員
4. 靜態方法裡只能使用靜態屬性