1.抽象类、抽象方法(abstract)
正常定义类(方法)的前面,加上关键字:abstract,就构成抽象类(方法)。
抽象类:抽象类就是用来做父类的,可以用来规范一些类的共同特性,不能被实例化,子类继承了它的特性,这就是“规范作用”
抽象方法:抽象方法是一个没有方法体(也不含大括号)的方法定义“头”而已。例如:abstract function f1($x1, $y, $m);
抽象类抽象方法细节关系描述:
1.抽象方法只能存在于抽象类。
2.但,一个抽象类中,可以没有抽象方法——但通常意义不大。
3.子类继承自一个抽象类,则子类必须实现父类中的所有抽象方法,除非子类也继续作为抽象类
4.子类实现抽象父类的方法时,访问控制修饰符的范围不能降低,且方法的参数也须一致——其实这就是重写,所以要满足重写的要求。
2.接口(关键词:interface、implements--实现 )
定义:更抽象的抽象类(方法全为抽象方法)就是接口。
因为接口中的方法都是抽象的,则下级类就必须:
1.要么实现该抽象方法(写出其方法体)
2.要么也声明为抽象方法——等待更下一级的类去实现。
一个类只能继承一个父类,但可以实现多个“上级接口”,语法形式:
class 类A extends 类B implements 接口1,接口2,.... { 。。。类定义语句。。。}
一个接口同样可以继承另一个接口(也是单继承):
interface 接口1 extends 接口2 {接口定义}
3.重载
在一个类中,有多个同名的方法,每个方法的参数不同而已。这种现象就称为“重载”。
参数不同可以是:数量个数不同,或类型不同,或顺序不同。
属性的重载:
如果某属性不存在,但在语法中使用如下情形,则会发生:
取值:$v1 = 对象->属性; ===>自动调用类中的__get()方法
赋值:对象->属性 = XX值; ===>自动调用类中的__set()方法
判断是否存在:isset(对象->属性;) ===>自动调用类中的__isset()方法
销毁:unset(对象->属性;) ===>自动调用类中的__unset()方法
前提都是:类中要预先定义好这些方法。
方法的重载:
当使用一个对象调用一个不存在的普通方法的时候,会自动去调用预先定义好的"__call"方法。
当使用一个对象(类)调用一个不存在的静态方法的时候,会自动去调用预先定义好的"__callStatic"方法。该方法必须带两个参数
几个魔术方法:
__get(), __set(), __isset(), __unset(), __call(), __callstatic();
4.类的自动加载:使用一个类的时候,自动引入类文件
方法1:使用__autoload魔术函数
方法2:使用spl_autoload_register函数
5.克隆
浅克隆:只能克隆非对象非资源(php的默认),一个类的对象数据更改了,另一个类也会更改,克隆不完全。
深克隆:需要再写个方法把对象克隆一下
要想实现深克隆(一个对象的所有属性数据都彻底实现了“复制”),就需要对该对象类使用魔术方法:__clone(),并在里面来实现深度克隆——人为去复制浅克隆复制不了数据。