final关键词 static静态属性和静态方法

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

猜你喜欢

转载自www.cnblogs.com/zhony/p/10251827.html