面向对象的开发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集

相关文章
相关标签/搜索