类的继承
一个类可以继承另外一个类的属性跟方法
PHP中类的继承只有单继承,没有多继承,也就是一个类只能继承一个类,而不能继承多个类
但是,我们可以通过一些方法让一个类继承多个,比如:类b继承类a,类C再去继承类b的话不就同时继承了类a跟类b了
继承需要用到一个关键字
extend
语法:
Class 类名 extends 被继承的类名{}
继承的本质:继承不是将父类复制到子类,而是通过继承链条的形式,先到子类找,如果找不到就会到父类找!
重写override
含义:当子类的成员的名字与父类的成员相同,那么在访问子类的时候,子类会将父类的成员覆盖,也就是跟前面说到的继承链条的形式,先找子,再找父,先找到谁就用谁
一个面试题:
$this永远代表所在类的对象吗?
不是!
$this究竟代表哪个类的对象,不是由$this的代码写在哪个类决定的,而是根据当前方法的执行环境决定的,执行环境也叫执行上下文,执行上下文是可以向上或者向下传递的!
访问控制修饰符
访问控制修饰符有三个
public:公共的,当前类内,继承链类内和类外都可以被访问到!
protected:受保护的,当前类内和继承链类内可以被访问,但是类外不能访问!
private:私有的,只有当前类内可以被访问到!
一般在项目内类里面的成员会尽量的隐蔽,也就是私有,然后再开放出几个公共的端口方法,让用户访问
如果父类有私有成员的话,子类能够继承,但是不能直接访问
final 最终类
值的是这样的类智能实例化,而不能被继承,但是可以继承别人
语法:在class前加上final
最终方法final method
在一个方法名的前面加上final关键字之后,就变成了最终方法!
最终类的意思是该类不能被继承,最终方法的意思是该类不能被重写!
所以,最终方法的意义是当该类被继承的时候,父类里面的最终方法不能被重写!
abstract抽象类
含义:只能被其他类继承,不能实例化
抽象类的作用
1, 可以完成普通类的继承,为其他的类提供了公共的代码!
2, 用于规定子类中必须要出现的方法成员,规定子类的结构,在真实的项目中,往往是保证完成一系列功能相似的多种操作类的结构保持一致!我们要求这些功能相似的类都继承自同一个抽象类!
3, 子类必须要有抽象类的属性跟方法,不然就会报错
interface接口
接口就是一个对象对外的公共的操作方法!
对象的封装性:对象把里面的定义代码尽量隐藏起来,用户不需要知道里面的功能是如何实现的,用户只需要操作这个类提供的接口方法就行了!
在PHP中定义一个接口,其实就是一种纯粹的规范或规定,用来规定该接口的子类必须要实现的公共的方法!
在接口中只能出现两种成员:
接口常量:其实就是普通类常量,不过是出现在接口中而已!
抽象方法:必须声明为public(与抽象类不同,抽象类可以定义所有类型的成员)
抽象方法不需要用到abstract关键字,因为interface接口其实不算类,里面的方法默认是抽象方法!
只要是继承它的子类,都必须要它的要求声明常量跟创造方法
接口与抽象类的比较
1, 从逻辑结构上来看,接口可以看成是抽象类的一个“子集”;都可以规定下级类的内部结构,只是接口里面只能有接口常量和公共抽象方法!
2, PHP不支持多继承,但是支持多实现,也就是说,一个类可以同时实现多个接口!这也是接口与抽象类的最本质的区别!
在真实的项目中,用接口使用的多一些!
overload重载简介
指的是对不可访问的成员的处理,称之为成员的重载!
也就是说,为一个不存在的属性赋值的时候,PHP默认的是支持该属性重新加载到当前对象的内部成员中,这种现象就是属性的“重载”!
其实,PHP对访问不可访问的成员,是可以采取相应的操作进行处理的!
根据所处理的成员的不同,重载又可以分成:属性重载和方法重载!
属性重载
系统有几个魔术方法是关于属性重载的
一共有四个,分别处理属性操作的4种情况:
当为一个不可访问的属性进行赋值的时候: __set()
当获取一个不可访问的属性的值的时候:__get()
当删除一个不可访问的属性的时候:__unset()
当判断一个不可访问的属性是否存在的时候:__isset()
__set(类名,值);
__get(类名)
__unset(类名)
__isset(类名)
方法的重载
__call()
当调用一个不可访问的非静态方法(对象方法)的时候,会自动执行该魔术方法!
系统默认的行为是报错:
需要两个参数
String 方法名,字符串型,需要加上引号
Array 参数数组 所访问的方法的参数数组
__callstatic()
触发时机:当访问一个不可访问的静态方法的时候,会自动执行该方法!注意:需要在该方法的前面加上static关键字!因为,当访问的静态方法不存在的时候,也应该由类来访问这个魔术方法,所以需要加上static关键字!
需要的参数跟__call一样
魔术方法和相关的魔术常量
魔术方法
__invoke()
触发时机:当把对象当做一个函数或方法来调用的时候,会自动执行该魔术方法!目前用的不是太多!
__toString()
触发时机:将一个对象当做一个字符串来使用的时候,会自动触发该方法!
魔术常量
__CLASS__
代表当前类名
__METHOD__
代表当前的方法名!
__NAMESPACE__:代表当前命名空间名!
后期静态绑定
总结一下static的关键字的作用:
1, 在定义局部变量的时候可以使用,成为静态局部变量,和变量的生命周期有关
2, 在类中定义静态成员的时候,代表的含义是指该成员属于所有的对象所共享的成员,应该由类进行管理
3, 代表“当前类”!