重读PHP OOP的抽象、继承、多态

26点 林涛 8270℃ 0评论

在面向对象编程语言中,并不是所有的面向对象语言 都有类的概念。传统的oop语言中存在类的概念。

类:其实用来抽象对象。 对某类事物, 下个定义,规定了其有哪些属性和能力(方法)。

抽象:将现实或者逻辑世界实体, 变成 编程设计语言的 对象的过程。 也可以称作是 封装的过程。 将某些数据和某些操作制作成一个统一的整体(对象)

OOP的三大特征:

封装:

定义类的过程。

尽量使用 私有化成员,如果用户需要操作,则应该提供相应的操作接口完成。

继承:

如果oop编写中,出现了 属性 与 方法的重叠,将重复代码提取,形成一个对象,然后让需要使用重复代码的对象,继承自这个对象。

多态:

一个方法成员多种形态。

注意:以上代码是不能执行的, 只是用来模拟 一个方法的不同形态。

继承:

面向对象内 继承 指的是 对象继承自另一个对象,可以将另一个对象内的方法和属性全部拿过来为自己使用。

在语法上,继承使用 类 来完成。

使用 关键字 extends 来完成 类 之间的继承。

再使用 实例化 就可以得到一个继承的对象。

这样  我们通过 D 类 实例化的对象 就拥有了 C类对象的所有属性。

方法也可以继承,

但是继承 并不是指 将父类的代码复制到子类中,而是说明在父类与子类之间 维护了一条关系,通过这个关系 达到成员继承的目的。

在继承时的成员控制:

Public 公共的 所有地方都可以被访问(本类内,父类类,子类类,类外)

Private 私有的 本类内可以被访问(本类内)

Protected, 指的是在整个类继承链内,可以被访问。(本类,父类,子类)

其中 :

私有的成员 不能被继承, 但是可以在子类内被访问。

受保护的成员可以被继承,但只能在类内访问

公共的成员 可以被继承,并且类内 类外都可以。

注意:访问控制 控制的是 对象级别的  还是 类级别 的访问?

是站在 类的角度去 衡量 一个成员是否能被访问到,而不是 站在对象的角度。因为,同一个属性 有时可以被访问,有时不能被访问,取决于访问代码的位置。

小技巧,

如果一个类不涉及到继承 就尽量使用 private 控制成员权限

如果涉及到继承, 就会尽量使用 protected 控制权限。

#p#oop三大特征-继承使用的细节#e#

继承时 如果出现冲突 应该怎么处理?

成员名称的冲突

如果出现成员冲突,则子类会重写(override)父类的代码。

如果子类中找不到,则会去父类查找:

访问权限的冲突,

如果名称相同,但是访问控制不同 ,是如何处理的?

在继承的情况下 要求同名的成员的访问级别, 子类的级别 应该 高于(强于) 父类的级别。如果父类的为 protected 子类的应该是 protected 或者 public。

Parent

如果我们需要在类中访问父类的同名的成员的话,需要使用parent关键字来代替父类。从而访问父类资源(静态方法,方法,静态属性,常量).

例如 访问父类的构造方法:

Self::   代替本类

Php的类继承 是 单继承,指的是,一个类只能通过继承另外一个类,不能同时直接继承多个类。

继承在平时开发中的使用:

一个项目多张表,管理表,对每个表进行增删改查,针对每个表的操作,都定义成一个类的话。可以让他们都继承一个基类(db类)

#p#oop三大特征-final类-抽象类-接口#e#

不能被继承的类。

不能被继承的 称之 Final类,定义的方式非常简单  class前增加 final关键即可。

继承时 会 出错。

 

Final关键的 还可以写到 方法前。

说明这个方法不能被重写。但是所在类可以被继承。

只能被继承的类。

不能实例化对象 只能被别的类来继承。

这种类 称之为  抽象类 使用关键字  abstract来实现。

Abstract class 类名{}

通常 会在抽象类中,定义抽象方法(只有方法名,没有方法体的方法)。规定 继承这个抽象类的子类内,应该必须有哪些方法,换句话说,就是继承抽象类的子类必须实行该抽象类的所有抽象方法。

通常会在 同一类操作的不同介质之间,例如(同样的数据库操作,但是不同的数据库类型),采用抽象类的形式 规定 不同的操作介质的操作接口应该一致:

注意,抽象类内,除了抽象方法外还可以存在 其他的非抽象方法,和属性的定义。

由于抽象类也属于类的范畴,但是也不能做多继承。 不能使用多个类 来规定 某一个类的内容。

接口:interface

专门用来规定类的结构的。它 可以同时使用多个接口去规定一个类的结构。

接口的定义:

Interface 接口名 { 接口成员 } 接口成员:常量 和 方法 接口的使用, 接口需要使用 类来实现 才能有意义: Class 类名 implements 接口名列表 { 类成员,必须实现接口内的不完整的方法才可以。 }

Php中是否支持多继承?

如何模拟多继承?

可以使用接口技术 模拟。

接口和接口之间可以相互实现么?

可以互相继承。使用extends关键字。

接口是不是类?是不是抽象类?都是抽象方法的类?

接口不是类,不是抽象类。但是可以理解成 全都是抽象方法的抽象类。

如需转载请注明: 转载自26点的博客

本文链接地址: 重读PHP OOP的抽象、继承、多态

转载请注明:26点的博客 » 重读PHP OOP的抽象、继承、多态

喜欢 (0)or分享 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x