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

三大核心无处不在,不管是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. ABP框架——单表实体流程

    实体实体配置文件菜单本地化语言:xml文件权限配置领域服务应用层CRUDDTOSPA路由:app.js视图生成:.html,.js

  2. StaticResource和DynamicResource

    Resource 资源(Resource)是保存在可执行文件中的一种不可执行数据,用来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等我们可以在任何元素上定义资源 Sta ...

  3. net share列出了Windows的默认共享(包括C盘)

    另外还有单独开启办法: 开启共享方法: 命令行方式:net share 博客=F:\娱乐\种子 我设置了一个名为“博客”的共享,路径为:“F:\娱乐\种子”. GUI方式:找到“F:\娱乐”的“种子” ...

  4. MVC 身份验证和异常处理过滤器

    :在Global中注册为全局过滤器,应用于所有的Controller的Action 参数类均继承自ControllerContext,主要包含属性请求上下文.路由数据.结果 using FilterE ...

  5. CentOS7下Docker安装

    Docker现在有CE和EE版本 , CE版本是免费版本 , 该文档安装的就是CE版本 1.删除旧版本docker 保险起见 , 走流程 yum remove docker \ docker-clie ...

  6. 零元学Expression Blend 4 - Chapter 31 看如何简单的把SampleData 绑进ListBox里

    原文:零元学Expression Blend 4 - Chapter 31 看如何简单的把SampleData 绑进ListBox里 前面几章连续讲到ListBox的运用,本章要讲得是如何简单的把Sa ...

  7. 在Delphi中关于UDP协议的实现

    原文地址:在Delphi中关于UDP协议的实现作者:菜心 首先我把UDP无连接协议的套接字调用时序图表示出来 在我把在Delphi中使用UDP协议实现数据通讯收发的实现方法总结如下:   例子描述:下 ...

  8. RoboVM 1.1 发布,Java 转原生平台代码

    分享 <关于我> 分享  [中文纪录片]互联网时代                 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...

  9. 预处理器#include 指令

    预处理器发现 #include 指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中.被包含文件中的文本将替换源代码文件中的#include指令,就像你把被包含文件中的全部内容键入到源文件中 ...

  10. VirtualTreeView控件

    很好用的一个列表控件,可以用来代替Delphi自带的ListView和TreeView,而且也一直在更新,目前已经支持最新的XE2 官方网站:http://www.soft-gems.net SVN地 ...