现在有如下需求:
我写了一个类,你只可以使用,不可以继承,也不能重写其中的方法,如果实现?
类或者方法一旦声明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. 静态方法里只能使用静态属性