首页 > 代码库 > 面向对象2

面向对象2

类的继承

一个类可以继承另外一个类的属性跟方法

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, 代表“当前类”!

面向对象2