1. 程式人生 > >11:類常量魔術變數、抽象類與延遲繫結

11:類常量魔術變數、抽象類與延遲繫結

常量、類常量、魔術變數

  • 普通常量:define(‘常量名’,‘常量值’);

    • 全域性可訪問
    • 值不可改變
  • 類常量:const 常量名 = 常量值;

    • 在PHP7中
    • 類內可以訪問,類外則根據許可權的不同而定
    • 他與靜態屬性類似,唯一區別就是:值不可改變
    • 宣告時不用加$符號
  • 魔術變數

    • 兩個特點:

    • 無法手動修改這個變數的值

    • 魔術變數的值是隨著環境的變動而改變的

    • 魔術變數很多,它們的作用很大,能在開發中幫助你快速高效的解決一些問題,所以請認真的翻閱一遍手冊,對魔術變數都有那些,有一個大概的認知;

    • 幾個小示例

      define('br','<br/>');
      
      echo '當前正在執行的是:',__FILE__,'檔案';
      
      echo br;
      
      echo '當前在',__DIR__,'目錄下';
      
      echo br;
      
      class A {
      	static function say(){
      		echo '當前類名為:',__CLASS__;
      	}
      }
      
      A::say();//當前類名為:A
      

延遲繫結

  • 問題描述:

    • 父類有一個靜態公共的A方法和一個靜態公共的B方法
    • 子類有一個靜態公共的A方法
    • 靜態呼叫子類的B方法,此時,輸出什麼?
  • 程式碼示例:

class A{
	static function haha(){
		echo '我是父類的haha方法';
	}

	static function hehe(){
		self::haha();
	}
}


class B extends A{
	static function haha(){
		echo '我是子類的haha方法';
	}
}


B::haha();
  • 結果:輸出父類haha的echo;

  • 原因:因為self所在的位置是父類,

  • 但是!當self換成static時,結果就不一樣了,換成static

    之後,輸出的結果是子類的haha方法所輸出的文字;

  • 為什麼?

  • 因為self僅代表當前類,如果當前類沒有,就是沒有,報undefined;

  • static則是:如果子類有,就用子類的,如果子類沒有,就用我自己的,如果子類也沒有,我也沒有,那就報錯,undefined;

  • 上面的程式碼,self換成static之後,則優先使用子類的haha方法,如果子類沒有haha方法,則使用父類的haha方法;

  • static會一直向上找,子類沒有,我自己也沒有,就向本類的父類找,向本類的父類的父類找,最終沒有就報錯;

抽象類

抽象類的定義

  • 就是對類進行抽象

  • 類前加abstract就是抽象類

  • 方法前加abstract就是抽象方法

  • 抽象方法不能有方法體

  • 抽象類,不能被New例項化

  • 有抽象方法的類都是抽象類

  • 抽象類內不一定有抽象方法

  • 抽象類其實就是起到了一個類模板,類的規範的作用;

抽象類的意義

  • 抽象類是不完整的,它的剩餘功能是由子類來完成的
  • 也就是說,抽象類這個概念的存在,我們可以用於規範方法,生成一個類的模板,供大家比對著模板去寫自己的方法
  • 中小型專案中,或者說團隊人員較少的情況下,為了迅速的開發,抽象類這些什麼規範是被摒棄的,如果你時間足夠多,你可以嘗試在多人協作的時候使用這些規範化的東西;

延遲繫結

  • 是指類的self的指向,不是以定義時為準,而是在執行時的計算結果為準;
  • 其實延期繫結很簡單,就是執行時的指向;
  • 只要區分了self 和static 的區別就OK,self主要是隻在本類找,而static是先從例項化物件的類中開始找,沒有就向父級找,找到最終類還沒找到,就報錯;就這麼簡單;