php的开始之路
三大核心:封装,继承,多态
三大核心无处不在,不管是php传统的面向过程化编程,还是后来加入的oop面向对象编程,都一直贯穿整个php的发展进步史。
面向对象,面向接口五大原则:单一职责,封闭-开放,接口隔离,依赖倒置,替换原则
看到书中对于五大原则的讲解非常详细,但是不易于记忆,个人自我总结下:
单一职责:想到单一职责,我脑子里会想到这不就是核心概念里面的封装吗?打个比方就是吃饭这个动作,可以比喻成人的一个职责。那么吃饭就不应该有其他动作,就像小时候爸妈常教育我们一样,吃饭的时候不要说话,吃饭的时候不要玩手机,这就是单一职责,吃饭可能由很多动作组成,但是它最终的目的就是把饭放入嘴里。就像封装一个类一样,类里面的接口eat(),吃饭可能用到嘴,手,碗,筷子。。这些属性,但是绝对不会用到电视。
封闭-开放: 封闭可以和上面的单一职责串联起来,就是我这个类产生的对象,是封闭的我只做输出固定的方法,做固定的事,你不能要求我做别的。这样感觉我们是冲突的封闭和开放就是一对反义词,但是不然,封闭是对这个类,这个对象的功能的封装,开放是对这个对象的成长开放。例如说模块的拓展,就像我刚开始封装一个人的类,我可以创建出工人这个对象,工人这个对象的固定职责就是工作干活,我再生成一个老师这样一个对象,职责就是教书育人。这样就封装好了,,,但是后来我又想再封装一个老板或者封装一个程序猿这样的一个对象,,,那么就用到了我们的核心开放,针对我们写的类这个对象的生成模板,不是一成不变的。我们封闭的意义是给一个对象定义单一的一个职责,而开放是为了让这个类具有更多的创造能力,可以创造更多具有单一职责的对象。
接口隔离:这个可能就是对一个类里面的接口做一个封闭,或者理一下关系,一个类然后是很多个对象然后是很多的方法(接口),接口的隔离其实也很想单一职责里面说的。但是接口更像是更细分,更小。我们说单一职责,是对象老师负责教书育人这是他的职责,但是教书育人怎么教呢,,,那么问题来了。这就涉及对象后的接口,我理解是方法。也就是对象生成后调用的接口应该是隔离的。。。如对象是老师,职责教书育人,调用的接口很多,如讲课,备课,管理班级,批改试卷。。。而接口隔离,就像是我在备课,但是你不能让我备课的时候再去批改试卷,这就是接口隔离的意义吧!当然理论上说,老师这个对象一遍备课,一遍批改是试卷是可以的,但是我们设计类,设计对象,设计接口的时候不能这么做,这就是接口隔离。
依赖倒置:这个依赖倒置我感觉更像是人为判断和固定思维。。。举一个应用场景哈, 我和我老婆去商场买化妆品,然后到化妆品柜台去了,问有没有xxx洗脚水(开玩笑哈!!!),然后柜台服务员像我们介绍洗脚水,我们买完然后结账。 这是正常流程,而依i赖倒置原则我理解是,你可以这样走正常流程去买洗脚水。然后调用各种对象去处理这个流程中涉及的动作,但是你也必须可以反着来,,,反过来就是站在化妆品柜台的角度,柜台服务员看到我和我老婆过来了,然后这个化妆品柜台比较奇葩它只买洗脚水,然后直接就想我们介绍洗脚水,然后买完结账。这就像是一个固定思维,当我走到洗脚水化妆品店门口的时候就,判断出我是买洗脚水的。然后直接走接下来的流程。。。而不是我选择了要买洗脚水然后选择去化妆品店门口。就像是倒着来的,化妆品洗脚水并不依赖于察言观色,反正来了就是买洗脚水的,
替换原则:这个就设计到了核心中的继承了,当创建一个基类,然后再写一个派生类也就是子类的时候,子类必须可以替代父类在任何一个地方出现,也就是子类必须能实现父类所能实现的功能,当然这是在特定的场景下,因为派生类本来就是为了应对不同的场景,然后根据细微的区别而产生的。
其实上面的总结我也是一知半解,不太理解多态去哪了,多态可能更多的设计到业务场景,就像在人这个类中,给出一些特征(也就是参数)来生成一个对象,这就像是多态,在不同的参数下会生成不一样的对象,就像我们确定一个人是做什么工作的,如果给你说特征,,,比如教书,然后公务员,工作地点在学校,那么你应该可以确定这个对象是一个老师,如在工地干活,干体力活,晒得有点黑,身体强壮,你也应该可以判断他是一个工人对象。这应该就是多态的定义吧!我们上面说到面向对象设计五大原则基本都设计到了封装,继承和多态。很灵活,也很容易被绕晕,我到现在都不敢说自己能完全理解这三大核心和五大原则,但是这三核五大确实是编程的开始和经典。
php的开始之路的更多相关文章
- webp图片实践之路
最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- JavaScript进阶之路(一)初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- jQuery学习之路(1)-选择器
▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...
- 记录我这一年的技术之路(nodejs纯干货)
2015年12月28日23:19:54 更新koa应用.学习型网站和开发者工具等 coding伊始 开始认认真真的学习技术还是2015.10.21日开始的,记得很清楚,那天,是我在龙湖正式学习的第一天 ...
- 一个IT人的成长路
毕业四年多了,来深圳三年多了,经历了刚毕业的懵懂少年,成长为现在的成熟稳重青年.职场上,从刚毕业的小白,成长为现在可以成熟应对各种事情的老司机.经历过从初级研发工程师,到中级研发工程师,到高级研发工程 ...
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- redis成长之路——(一)
为什么使用redis Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就 ...
- 一个软件开发者的BPM之路
我是小林,一名普通的软件工程师,从事BPM(业务流程管理)软件开发工作.我没有几十年的技术底蕴,无法像大牛们一样高谈阔论,品评BPM开发之道:也不是资深的流程管理专家,能与大家分析流程管理的时弊.我只 ...
- Java 进阶 hello world! - 中级程序员之路
Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...
随机推荐
- WPF 4 目录树型显示
原文:WPF 4 目录树型显示 本篇将通过WPF4 制作简单的目录树型结构显示实例,完成本篇内容我们将作出下图所示的应用程序. 从图中我们可以看到程序主要分为两部分:左边显示本地驱 ...
- This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...
- Visual Studio查找中文的正则表达式
原文: Visual Studio查找中文的正则表达式 经常有这样的需求:项目代码中有一些输出信息是中文写的,不过现在要做国际化,代码""中写的中文都要改成英文.这样就需要将代码中 ...
- C#匹配中文字符串的4种正则表达式分享
本文介绍在C#中使用匹配中文的正则表达式,包括纯中文.有中文.中文开头.中文结尾等几个正则表达式示例.在正则表达式中,中文可以通过Unicode编码来确定正则表达式范围. 在C#中,匹配中文的正则表达 ...
- 微信小程序把玩(四十一)canvas API
原文:微信小程序把玩(四十一)canvas API 绘图是每个移动应用必备的技术,基本上和Android,IOS,等移动开发都是相同的,创建个上下文,给你个画布再上画,官网给的小例子都比较全了自己去看 ...
- Android零基础入门第46节:下拉框Spinner
原文:Android零基础入门第46节:下拉框Spinner 上一期学习了GridView的使用,你已经掌握了吗?本期一起来学习Spinner的使用. 一.认识Spinner Spinner其实就是一 ...
- 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good
上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非 ...
- QT---Winsocket获取网关(Gateway) 主机IP等信息
基于WinPcap库做开发,需要利用到局域网的默认网关地址和Mac地址,但是WinPcap实现获取网关IP地址没有很好的思路,可以知道的是网关的接收和发出的数据包数量一般是比局域网内的各主机要多的 ...
- Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest?
原始链接:Introduction: Why Google C++ Testing Framework? 词汇表 版本号:v_0.1 介绍:为什么使用GTest? GTest帮助你写更好的C++测试代 ...
- python中的内置函数(2)
一.lambda匿名函数定义:为了解决一些简单的需求而设计的一句话函数例子:计算n的n次方 def func(n):#正常的写法 return n**2 f=lambda n:n**2 这里的lamb ...