1、final 关键字
被 final 关键字修饰过的类和方法就是“就是最终版本”。如果一个类的格式为:
final class name{……}
说明该类不可以继承,也不能有子类。
如果一个方法的格式为:
final function method name()
说明该方法在子类中不可以进行重写,也不可以被覆盖。
【例1】本例为 SportObject 类设置关键字 final,并生成一个子类 MyBook。可以看到程序报错,无法执行。代码如下:
结果为:
Fatal error: Class MyBook may not inherit from final class (SportObject) in D:\project\collection\test\11.phpon line 11
2、抽象类
抽象类是一种不能被实例化的类,只能作为其它类的父类来使用。抽象类使用 abstract 关键字来声明,格式为:
abstract class class_name{}
抽象类和普通类相似,包含成员变量、成员方法。两者的区别在于,抽象类至少要包含一种抽象方法。抽象方法没有方法体,其功能的实现在子类中完成。抽象方法也是使用 abstract 关键字来修饰的,格式如下:
abstract function name();
【例2】下面实现一个商品抽象类 CommodityObject,该抽象类包含一个抽象方法 service()。生成两个子类 MyBook 和 MyComputer,分别在两个子类中实现抽象方法。最后实例化两个对象,调用实现后的方法,输出结果。代码如下:
运行结果如下图所示:
3、接口的使用
集成特性简化了对象、类的创建,增加了代码的可重性。单 PHP 只支持单继承。如需要实现多继承,就需使用接口。
接口类通过 interface 关键字来声明,并且类中只能包含未实现的方法和一些成员变量,格式如下:
interface interfaceName{function name1();function name2();}
注意:不要用 public 以外的关键字来修饰接口中的类成员,对于方法,不写关键字也可以。这是由接口类自身的属性决定的。
子类是通过 implements 关键字来实现接口的,如要实现多个接口,可在每个接口之间使用逗号“,”隔开。而且接口类中所有未实现的方法在子类中全部实现,否则PHP会报错。
【例3】首先声明了两个接口 MPopedom 和 MPurview,接着声明了两个类 Member 和 Manager,其中Member 类继承了 MPopedom 接口;Manager 继承了 MPopedom 和 MPurview 接口。分别实现各自成员方法后,实例化两个对象,调用实现后的方法。代码:
运行结果图
通过上面的实例可以发现,抽象类和接口实现的功能十分相似。抽象类的优点是可以在类中实现公共方法,而接口则可以实现多继承。
4、魔术方法
(1)__set()和__get()方法
这两个魔术方法的作用分别为:
当程序试图写入一个不存在或不可见的成员变量时,PHP就会执行__set() 方法。__set()方法包含两个参数,分别表示变量名和变量值,两个参数不可省略。
当程序调用一个未定义或是不可见的成员变量时,可以通过__get() 方法来读取变量的值。__get()方法有一个参数,表示要调用的变量名。
(2)__call() 方法
__call()方法的作用是:当程序试图调用不存在或不可见的成员方法时,PHP会先调用__call()方法来存储方法名及其参数。__call()方法包含两个参数,即方法名和方法参数。其中,方法参数是以数组形式存在的。
代码
结果图
总结,PHP安全问题有哪些
php session 会话使用案例