三大核心:封装,继承,多态

三大核心无处不在,不管是php传统的面向过程化编程,还是后来加入的oop面向对象编程,都一直贯穿整个php的发展进步史。

面向对象,面向接口五大原则:单一职责,封闭-开放,接口隔离,依赖倒置,替换原则

看到书中对于五大原则的讲解非常详细,但是不易于记忆,个人自我总结下:

单一职责:想到单一职责,我脑子里会想到这不就是核心概念里面的封装吗?打个比方就是吃饭这个动作,可以比喻成人的一个职责。那么吃饭就不应该有其他动作,就像小时候爸妈常教育我们一样,吃饭的时候不要说话,吃饭的时候不要玩手机,这就是单一职责,吃饭可能由很多动作组成,但是它最终的目的就是把饭放入嘴里。就像封装一个类一样,类里面的接口eat(),吃饭可能用到嘴,手,碗,筷子。。这些属性,但是绝对不会用到电视。

封闭-开放: 封闭可以和上面的单一职责串联起来,就是我这个类产生的对象,是封闭的我只做输出固定的方法,做固定的事,你不能要求我做别的。这样感觉我们是冲突的封闭和开放就是一对反义词,但是不然,封闭是对这个类,这个对象的功能的封装,开放是对这个对象的成长开放。例如说模块的拓展,就像我刚开始封装一个人的类,我可以创建出工人这个对象,工人这个对象的固定职责就是工作干活,我再生成一个老师这样一个对象,职责就是教书育人。这样就封装好了,,,但是后来我又想再封装一个老板或者封装一个程序猿这样的一个对象,,,那么就用到了我们的核心开放,针对我们写的类这个对象的生成模板,不是一成不变的。我们封闭的意义是给一个对象定义单一的一个职责,而开放是为了让这个类具有更多的创造能力,可以创造更多具有单一职责的对象。

接口隔离:这个可能就是对一个类里面的接口做一个封闭,或者理一下关系,一个类然后是很多个对象然后是很多的方法(接口),接口的隔离其实也很想单一职责里面说的。但是接口更像是更细分,更小。我们说单一职责,是对象老师负责教书育人这是他的职责,但是教书育人怎么教呢,,,那么问题来了。这就涉及对象后的接口,我理解是方法。也就是对象生成后调用的接口应该是隔离的。。。如对象是老师,职责教书育人,调用的接口很多,如讲课,备课,管理班级,批改试卷。。。而接口隔离,就像是我在备课,但是你不能让我备课的时候再去批改试卷,这就是接口隔离的意义吧!当然理论上说,老师这个对象一遍备课,一遍批改是试卷是可以的,但是我们设计类,设计对象,设计接口的时候不能这么做,这就是接口隔离。

依赖倒置:这个依赖倒置我感觉更像是人为判断和固定思维。。。举一个应用场景哈, 我和我老婆去商场买化妆品,然后到化妆品柜台去了,问有没有xxx洗脚水(开玩笑哈!!!),然后柜台服务员像我们介绍洗脚水,我们买完然后结账。  这是正常流程,而依i赖倒置原则我理解是,你可以这样走正常流程去买洗脚水。然后调用各种对象去处理这个流程中涉及的动作,但是你也必须可以反着来,,,反过来就是站在化妆品柜台的角度,柜台服务员看到我和我老婆过来了,然后这个化妆品柜台比较奇葩它只买洗脚水,然后直接就想我们介绍洗脚水,然后买完结账。这就像是一个固定思维,当我走到洗脚水化妆品店门口的时候就,判断出我是买洗脚水的。然后直接走接下来的流程。。。而不是我选择了要买洗脚水然后选择去化妆品店门口。就像是倒着来的,化妆品洗脚水并不依赖于察言观色,反正来了就是买洗脚水的,

替换原则:这个就设计到了核心中的继承了,当创建一个基类,然后再写一个派生类也就是子类的时候,子类必须可以替代父类在任何一个地方出现,也就是子类必须能实现父类所能实现的功能,当然这是在特定的场景下,因为派生类本来就是为了应对不同的场景,然后根据细微的区别而产生的。

其实上面的总结我也是一知半解,不太理解多态去哪了,多态可能更多的设计到业务场景,就像在人这个类中,给出一些特征(也就是参数)来生成一个对象,这就像是多态,在不同的参数下会生成不一样的对象,就像我们确定一个人是做什么工作的,如果给你说特征,,,比如教书,然后公务员,工作地点在学校,那么你应该可以确定这个对象是一个老师,如在工地干活,干体力活,晒得有点黑,身体强壮,你也应该可以判断他是一个工人对象。这应该就是多态的定义吧!我们上面说到面向对象设计五大原则基本都设计到了封装,继承和多态。很灵活,也很容易被绕晕,我到现在都不敢说自己能完全理解这三大核心和五大原则,但是这三核五大确实是编程的开始和经典。

php的开始之路的更多相关文章

  1. webp图片实践之路

    最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...

  2. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  3. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  4. jQuery学习之路(1)-选择器

    ▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...

  5. 记录我这一年的技术之路(nodejs纯干货)

    2015年12月28日23:19:54 更新koa应用.学习型网站和开发者工具等 coding伊始 开始认认真真的学习技术还是2015.10.21日开始的,记得很清楚,那天,是我在龙湖正式学习的第一天 ...

  6. 一个IT人的成长路

    毕业四年多了,来深圳三年多了,经历了刚毕业的懵懂少年,成长为现在的成熟稳重青年.职场上,从刚毕业的小白,成长为现在可以成熟应对各种事情的老司机.经历过从初级研发工程师,到中级研发工程师,到高级研发工程 ...

  7. redis成长之路——(二)

    redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...

  8. redis成长之路——(一)

    为什么使用redis Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就 ...

  9. 一个软件开发者的BPM之路

    我是小林,一名普通的软件工程师,从事BPM(业务流程管理)软件开发工作.我没有几十年的技术底蕴,无法像大牛们一样高谈阔论,品评BPM开发之道:也不是资深的流程管理专家,能与大家分析流程管理的时弊.我只 ...

  10. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

随机推荐

  1. WPF特效-实现3D足球效果

    原文:WPF特效-实现3D足球效果 WPF 实现 3D足球效果,效果图如下:  每个面加载不同贴图. <UserControl x:Class="MediaBalll.Model3Ds ...

  2. 【msdn wpf forum翻译】获取当前窗口焦点所在的元素

    原文:[msdn wpf forum翻译]获取当前窗口焦点所在的元素 原文地址: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b ...

  3. Ogre 1.7.0,VS2005编译全过程傻瓜式教程

    最近下了最新版Ogre 1.7.0,从下载到最后编译运行成功Ogre自带的Sample花了将近一下午时间. 网上有很多编译Ogre的教程,这里整理我看过的教程,加上自己的经验再详细总结一遍. 第一步: ...

  4. Windows程序设计画图实现哆啦A梦

    在看雪论坛上看到的一个帖子,很喜欢,转载一下.原文地址:http://bbs.pediy.com/showthread.php?t=138630哆啦A梦是画出来的,不知道作者算这些坐标位置算了多久,真 ...

  5. vs2017 js cordova + dotnet core 开发app

    原文:vs2017 js cordova + dotnet core 开发app 1.记得在index.html加入 <meta http-equiv="Content-Securit ...

  6. google的开源项目总结(转载)

    转自http://www.feng5166.com/blog/424.html google的开源项目值得我们一用的,这些项目很有意义,甚至可以直接用在我们自己的工作上!学习编程的的一个比较好的方式就 ...

  7. Win10《芒果TV》商店版更新v3.2.3:新增应用内意见反馈、播放重试、透明磁贴

    在2016圣诞节临近之际,<芒果TV>UWP版迅速更新v3.2.3版,主要是新增应用内意见反馈提交功能.播放重试.透明磁贴.动态磁贴等功能,进一步优化稳定性.视觉细节.运行速度. 芒果TV ...

  8. .NET重思(二)接口和抽象类的取舍

    不得不说,接口和抽象类好像啊~两者都不可以实例化,并且未实现的部分都是由派生类实现的. 他们主要有这么个区别: (1)抽象类的派生类可以是派生类,换言之,抽象成员在派生类中不一定完全实现,而接口要求其 ...

  9. LINUX基础内容

    在Linux中,有三种基本的文件类型: 1) 普通文件 普通文件是以字节为单位的数据流,包括文本文件.源码文件.可执行文件等.文本和二进制对Linux来说并无区别,对普通文件的解释由处理该文件的应用程 ...

  10. Qt实现长文件名(字符串)在QLabel中自适应缩短

    一.应用场景简述 当在有限宽度的QLable中显示很长的文件名/字符串时,超出QLabel宽度部分将不会显示,此时采取缩短文件名策略(也可实现为字符串滚动动画)可以缓解这一问题.在实现这一想法的过程中 ...