1. 程式人生 > >final關鍵詞 static靜態屬性和靜態方法

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. 靜態方法裡只能使用靜態屬性