看完就能掌握的PHP核心技术 - ​​​​​​​​面向对象

继承和多态

类的组合与继承

●  假设我们有两个类,一个 person,另外一个是 family;在 family 类中我们创建 person 类中的对象,并且我们把这个对象视为 family 类的一个属性,并调用它的方法处理问题,那么这种复用方式也称为组合。

●  类与类之间还有一种父与子的关系,子类可以继承父类的属性和方法,我们称之为继承。在继承里,子类拥有父类的属性和方法,同时子类也有自己的属性和方法。

返回结果

●  组合和继承都是提高代码可重用行的手段。在设计对象模型时,可以按照语义识别类之间的组合关系和继承关系。

例如:

●  继承是一种 “是,像” 的关系,组合则是一种 “需要” 的关系 【父亲和儿子应该是继承关系,父亲和家庭应该是组合关系 】

●  组合偏重与和局部的关系,继承偏重与父与子的关系。

●  从方法复用的角度考虑,如果两个类具有很多相同的代码和方法,我们就可以从这两个类中抽象出一个父类,提供公共方法,然后两个类作为子类,提供个性方法,这时继承更好。

●  组合的限制很少,组合之间的类可以关系很小 (体现为复用代码),设置没有关系。

编程中

●  继承和组合的取舍往往都不是这么直接明了,很难说出二者是 “像” 的关系还是需要的关系。甚至说把它拿到现实世界中建模,更加无法决定是继承还是组合的关系了。这时,它该如何办,有什么标准?这个标准就是:低耦合

低耦合

●  耦合是一个软件结构内不同模块之间互联程度的度量,也就是不同模块之间的依赖关系。

●  低耦合是指模块和模块之间,尽可能地使模块间独立存在;模块与模块之间的接口尽量少而简单。现代的面向对象的思想不强调为真实世界建模,变得更加理性化一些,把目标放在解耦上。

解耦

●  目的是为了解除模块与模块之间的依赖。

●  继承和组合二者在语义上难以区分,但是我们更倾向于使用组合。

●  继承存在的问题:

    ○  继承破坏封装性;(鸟类为父类,而鸭子和鸵鸟作为子类,它们却拥有飞翔的方法)

    ○  继承是紧耦合的,使得子类和父类捆绑在一起。组合仅是通过唯一接口和外部进行通信,耦合度低于继承。

    ○  继承扩展复杂,随着继承层数的增加和子类的增加,将涉及大量方法重写。使用组合,可以根据类型约束,实现动态组合,减少代码。

    ○  不恰当的使用继承可能违反现实世界中的逻辑;

组合

●  在创建组合对象时,组合需要一一创建局部对象,这一点程度上增加了一些代码,而继承不需要这一步,继承拥有父类的方法,可以直接使用

如何使用继承:

●  精心设计专门用于被继承的类,继承树的抽象层应该比较稳定,一般不多于三层;

●  对于不是专门用于被继承的类,禁止其被继承,也就是使用 final 修饰符。使用 final 修饰符即可防止重要方法被非法覆写,又能给编辑器寻找优化的机会;

●  优先考了用组合关系提高代码的可重用性;

●  子类是一直特殊的类型,而不只是父类的一个角色;

●  子类扩展,而不是覆盖或者使父类的功能失效;

●  底层代码多用组合,顶层 / 业务层代码多用继承。底层用组合可以提供效率,避免对象臃肿。顶层代码用继承可以提高灵活性,让业务使用更方便。

既要组合的灵活,又要继承的简洁

●  多重继承,一个类可以同时继承多个父类,组合两个父类的功能;缺点:多重继承过于灵活,并且会带来 “零星问题”,故为其使用带来了不少困难,模型变得复杂起来。

●  traits php5.4 引入的新的语法结构,可以方便我们实现对象的扩展,是除 extend,implements 外的另外一种扩展对象的方式,traits 即可以使单继承模式的语言获得多重继承的灵活,又可以避免多重继承带来的种种问题

traits 的用法

●  通过在类中使用 use 关键字声明要组合的 Trait 名称,而具体某个 Trait 的声明使用 trait 关键词,Trait 不能直接实例化

●  Student 类通过继承 Person,有了 age 方法,通过组合 Drive,有了 driving 方法和属性 carName。

如果 Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢

●  当方法或属性同名时,当前类中的方法会覆盖 trait 的 方法,而 trait 的方法又覆盖了基类中的方法。

如果要组合多个 Trait,通过逗号分隔 Trait 名称:

语言中得多态

●  多态准确的含义是:同一类的对象收到相同消息时,会得到不同的结果。而这个消息是不可预测的。多态:顾名思义,就是多种状态,也就是多种结果

●  多态性是一种通过多种状态或阶段描述相同对象的编程方式。它真正的意义在于:实际开发中,只要关心一个接口或基类的编程,而不必关心一个对象所属于的具体类

案例

●  通过判断传入的对象所属的类不同来调用其同名方法来实现 ’ 多态 ’

●  通过接口实现多态

●  在这段代码中,doprint 函数的参数为一个接口类型的变量,符合 ’ 同一类型,不同结果 ’ 这一条件,具备多态的一般特征。

总结

●  多态指同一类对象在运行时的具体化。

●  php 语言是弱类型的,实现多态更简单,更灵活。

●  类型转换不是多态。

●  php 中父类和子类看作 ’ 继父 ’ 和’ 继子 ’ 关系,他们存在继承关系,但不存在血缘关系,因此子类无法向上转型为父类,从而失去多态最典型的特征。

●  多态的本质就是 if – else – ,只不过实现的层次不同。

更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的PHP技术交流群953224940

进阶PHP月薪30k>>>架构师成长路线【视频、面试文档免费获取】

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、类的封装 将对象的属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节,这就是封装的思想。比如,我们到餐...
    文哥的学习日记阅读 4,229评论 0 3
  • 面向对象主要特征 继承(inheritance) 继承也称泛化,继承性是子类自动共享父类属性和方法的机制。是类之间...
    狼人_4e19阅读 3,873评论 0 0
  • OOP概述 对象和类对象可以按类进行分类。类是表示彼此之前可能互有不同,但是必须具有一些共同点的对象集合。虽然类所...
    quanCN阅读 2,688评论 0 2
  • 面向对象核心技术 面向对象编程有3大基本特性:封装、继承和多态。 (1)类的封装:封装是面向对象编程的核心思想。封...
    蓝心天阅读 4,640评论 0 0
  • 面向对象简介 面向对象是相对于面向过程来说的,面向过程是一种以“过程”为中心的编程思想,分析出解决问题所需的步骤,...
    Java柚子阅读 1,189评论 0 0

友情链接更多精彩内容