在面向对象编程语言中,并不是所有的面向对象语言 都有类的概念。传统的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的抽象、继承、多态