面向对象的开发6 关键字 final self static const

final 关键字 用fianl定义的类将不能被继承,定义的方法不能被重载

self 关键字 不需要实例化,直接可以访问当前类中的静态内部成员

static关键字 定义类成员的静态属性或方法,可以在不实例化的情况使用,单独占用内存,不会因为创建了多个实例化对象而重复占用同样的方法或属性  

const关键字 定义类中的常量 等于PHP中的 difine 只能在类中使用

首先看一个例子

  
  
  
  
  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
 

这时输入想正常输出只能取消类的集成,直接实例化Myclass

  
  
  
  
  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;并且在不实例化的时候可以访问。

  
  
  
  
  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集

本文出自 “PHP学习笔记” 博客,转载请与作者联系!

你可能感兴趣的:(static,final,Const,self,休闲)