回顾
面向对象:自动加载(__autoload),类常量访问(范围解析操作符),静态(属性和方法:self)
设计模式:单例模式(三私一公),工厂模式
面向对象三大特性:封装,继承和多态(PHP不支持)
PHP继承:extends(对象继承:属性和非私有方法)
PHP继承
方法重写
子类拥有与父类同名的方法。
除了私有的属性和方法之外,系统一律都是去子类中查找属性和方法,但是如果对应的属性和方法是私有的,那么系统一定要去判断$this所代表的上下文(类环境),在哪个类就访问哪个类的私有属性和方法。
重写的原则:被重写的方法的访问权限一定要比原来的方法的权限要大(Open)。
PHP继承链
在php中不支持一个类继承自多个父类。
在有些语言中 可以实现多继承:class A extends B,C(PHP中不行)
PHP中可以通过继承链(链式继承)来实现子类继承多个“父类”。
静态在继承中的使用
静态的东西属于类,类其实在结构有类似继承概念,所以静态的内容也可以遵循继承的传统去跨类使用。
parent关键字
如果子类中重写了父类的方法,那么父类的方法就不再会被调用,但是有时候需要父类的方法也执行,就需用使用parent关键字:
在被重写的方法之内:parent::父类的同名方法()
特殊类
有时候不希望自己写的类被别人继承,因为继承就有可能破坏类的结构。
Final类
final类又叫做最终类,指的是使用final 关键字修饰的类,不可以被其他类继承。
final关键字还能修饰方法,表示被修饰的方法不能被子类重写。
final类的意义:不可以继承,防止类结构被破坏
抽象类
有些类不能够被实例化,只能被继承。
抽象类是使用abstract关键字修饰的类。
抽象类只能被继承
abstract关键字可以用在方法上;表示当前方法是抽象方法,抽象方法不能有方法体(大括号)
抽象方法必须被子类实现:重写并添加方法体
实现抽象类的抽象方法
继承抽象方法:子类也必须是抽象类
一个拥有抽象方法的类一定是抽象类(必须显示的对类使用关键字abstract)
抽象类的意义:抽象类用于规范下面的子类里面所拥有的方法的名字
如果项目较大,有可能使用抽象类,如果项目很小或者说不需要那么多规范,就不怎么使用抽象类。
抽象类中可以拥有普通类中任何的类成员,但是不能使用私有的访问修饰限定符(private)
接口
接口分为很多种
应用型接口:一种可以允许外部使用的入口
数据型接口:用来规范外部去实现某些功能的方式(结构规范)
定义接口
语法:interface 接口名字{//接口体}
接口体
接口体也称之为接口成员,指的是在接口中可以定义的内容。
在接口中,只能有方法和常量,而且方法必须是抽象(不需要abstract关键字:没有方法体)的,而且只能public修饰。
接口不能被实例化,接口也不能被“继承”,接口只能被实现:implements
实现接口
实现接口值:用类去实现接口,必须要实现接口中的所有的抽象方法。
接口意义
与抽象类一样,用来规范底层的类的结构。比抽象类更加严格的规范结构。接口是一种纯粹用于规范的一种结构。
接口只有在团队比较大,分支比较多的情况下,用于规范整个团队,保证内部的不同分支下的结构相同。
接口的特殊使用
接口可以多实现,一个类可以同时实现多个接口
class 类名 implements 接口1,接口2,…{}
接口可以继承接口:interface A extends B{} //B是接口
常见的面试题
1. 抽象类是不是类?
抽象应该理解为是类,但是不能被实例化的类。(用的是关键字class)
2. PHP是否支持多继承?如何模拟?
PHP不支持多继承,但是可以用链式继承来模拟实现多继承。
2. 接口是不是类?接口是不是抽象类?
接口不是类,接口是interface,而类是class;接口也不是抽象类
3. 接口能不能被继承?
接口只能被类实现,但是接口是可以被接口继承的。
类相关常用的方法
class_exists:判断类在内存中是否存在,用于在类的加载之前进行数据判断
interface_exists:判断接口是否存在
method_exists:判断方法是否存在,只要方法存在,跟方法所有的访问修饰限定符没有关系
get_class:得到对象类名
get_parent_class:得到父类名,获取当前对象对应的类的上级类的类名,如果上级也是继承自其它类,则获取不到。(只能获取父类名)