面向對象的開發6 關鍵字 final self static const

final 關鍵字 用fianl定義的類將不能被繼承,定義的方法不能被重載php

self 關鍵字 不須要實例化,直接能夠訪問當前類中的靜態內部成員web

static關鍵字 定義類成員的靜態屬性或方法,能夠在不實例化的狀況使用,單獨佔用內存,不會由於建立了多個實例化對象而重複佔用一樣的方法或屬性  ide

const關鍵字 定義類中的常量 等於PHP中的 difine 只能在類中使用this

首先看一個例子spa

  
  
  
  
  1. <?  
  2. class Myclass {  
  3.     public $name="MT";  
  4.     function Myfun(){  
  5.         return "我是".$this->name;  
  6.     }  
  7. }  
  8. class My extends Myclass{  
  9.     function Myfun(){  
  10.         return Myclass::Myfun()."第四季第10集";  
  11.     }  
  12. }  
  13. $My = new My();  
  14. echo $My->Myfun();  
  15.  
  16. ?> 

輸出結果 我是MT第四季第10集對象

若是改動下繼承

  
  
  
  
  1. <?  
  2. class Myclass {  
  3.     public $name="MT";  
  4.     final function Myfun(){ //這裏的方法用final定義  
  5.         return "我是".$this->name;  
  6.     }  
  7. }  
  8. class My extends Myclass{  
  9.     function Myfun(){  
  10.         return Myclass::Myfun()."第四季第10集";  
  11.     }  
  12. }  
  13. $My = new My();  
  14. echo $My->Myfun();  
  15.  
  16. ?> 

將會報錯 Fatal error: Cannot override final method Myclass::Myfun() in D:\web\bbs\class\class2.php on line 12
 內存

這時輸入想正常輸出只能取消類的集成,直接實例化Myclassstring

  
  
  
  
  1. <?  
  2. class Myclass {  
  3.     public $name="MT";  
  4.     final function Myfun(){ //這裏的方法用final定義  
  5.         return "我是".$this->name."第四季第10集";  
  6.     }  
  7. }  
  8. $Myclass = new Myclass();  
  9. echo $Myclass->Myfun();  
  10.  
  11. ?> 

固然,能夠使用self::name來代替$this->name;而且在不實例化的時候能夠訪問。it

  
  
  
  
  1. <?  
  2. class Myclass {  
  3.     static $name="MT"//這裏用static定義靜態屬性  
  4.     final function Myfun(){   
  5. return "我是".self::$name."第四季第10集";  //這裏用self
  6.     }  
  7. }  
  8. echo Myclass::Myfun();  
  9.  
  10. ?> 

用static定義的成員屬性,在使用self::屬性名訪問時,不會由於實例化中從新定義而改變

  
  
  
  
  1. <?  
  2. class Myclass {  
  3.     static $name="MT";  
  4.     final function Myfun(){ //這裏的方法用final定義  
  5.         return "我是".self::$name."第四季第10集";  
  6.     }  
  7. }  
  8. $Myclass = new Myclass();  
  9. $Myclass->name="小德"//這裏的賦值時不起任何做用的  
  10. echo $Myclass->Myfun();  
  11.  
  12. ?> 

仍是會輸出 我是MT第四季第10集

可是若是用$this->成員屬性名,就會改變

  
  
  
  
  1. <?  
  2. class Myclass {  
  3.     static $name="MT";  
  4.     final function Myfun(){ //這裏的方法用final定義  
  5.         return "我是".$this->name."第四季第10集";  
  6.     }  
  7. }  
  8. /*class My extends Myclass{  
  9.     function Myfun2(){  
  10.         return self::Myfun()."第四季第10集";  
  11.     }  
  12. }*/ 
  13. $Myclass = new Myclass();  
  14. $Myclass->name="小德";  //這裏就會起做用
  15. echo $Myclass->Myfun();  
  16.  
  17. ?> 

使用const能夠定義類中的常量

  
  
  
  
  1. <?  
  2. class Myclass {  
  3.     const NAME="MT";  
  4.     final function Myfun(){ //這裏的方法用final定義  
  5.         return "我是".self::NAME."第四季第10集";  
  6.     }  
  7. }  
  8. $Myclass = new Myclass();  
  9. $Myclass->name="小德";  
  10. echo $Myclass->Myfun();  
  11.  
  12. ?> 

仍然會輸出 我是MT第四季第10集

相關文章
相關標籤/搜索