第七章:第11节 PHP面向对象——类的其他形式:最终类和抽象类

更新于:2019-06-11 17:23:15

用“class 类名{}”定义一个类是最常用的方式,“class”关键字前面也可以额外加一些其他关键字做修饰。


Final关键字

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。 


最终类final class:

通常,一个类,没有特别声明的话,则“别人”就可以随意拿过来使用并对之进行“扩展”——继承。

但是:

如果某个类不希望对其进行扩展,则可以将其声明为“最终类”。

形式:

final  class  类名{ 。。。。类定义。。。。}


最终方法final method:

通常,一个方法,如果没有特别声明,则下级类就可以对其进行“覆盖”(重写)。

但是:

如果某个方法不希望被下级类覆盖,就可以对其生命为“最终方法”。

形式:

final  function  方法名(){。。。。方法定义。。。。}


手册里的两个示例:


1.png

了解下就好了,如果在项目开发时没有特殊要求,是没有必要做这样限制的。


注意:成员属性变量不能使用“final”修饰,在java对象中是可以使用“final”修饰的,用“final”修饰其实就是定义一个常量,在PHP对象中定义常量还是使用“const”修饰。

abstract关键字


抽象类:

在正常定义类的前面,加上关键字:abstract,那就构成抽象类。

abstract  class  类名{.....类的定义.....} 


抽象方法:

抽象方法是一个没有方法体(也不含大括号)的方法定义“头”而已。

前面需要加上abstract。

比如:abstract  function  f1($x1, $y, $m) ;//注意,后面一定有分号。

抽象方法只能存在抽象类里。


手册里的详细描述:


PHP5支持抽象类和抽象方法。抽象类不能直接被实例化,你必须先继承该抽象类,然后再实例化子类。任何一个类, 如果它里面至少有一个方法被声明为抽象的,那么这个类就必须被声明为抽象的。如果类方法被声明为抽象的, 那么其中就不能包括具体的功能实现。


继承一个抽象类的时候,子类必须实现抽象类中的所有抽象方法(除非子类也继续作为抽象类);另外,这些方法的可见性必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义为private。 


不能直接被实例化:

1.png

1.png


抽象方法不能存于普通类里:

1.png

1.png


抽象类有什么用?


抽象类可以用来规范一些类的共同特性,但又不需要去对其进行实例化。

怎么规范:继承它。

也就是说,抽象类的使命是专门做“父类”:子类就继承了它的特性,这就是“规范作用”。


抽象方法有什么用?


其实跟抽象类一样,配合抽象类,来实现对下级类的“行为规范”。

即相当于要求下级类必须去完成该功能(动作),但自己是不做的。


1.png

1.png


抽象类抽象方法细节关系描述


1,如果一个方法定义为抽象方法,则其所在的类必须定义为抽象类。

2,但,一个抽象类中,可以没有抽象方法——但这样的抽象类意义不大。

3,子类继承自一个抽象类,则子类必须实现父类中的所有抽象方法,除非子类也继续作为抽象类。

4,子类实现抽象父类的方法时,访问控制修饰符的范围不能降低,且方法的参数也须一致——其实这就是重写,所以要满足重写的要求。


本节学习代码》》》