@jtahstu
2017-10-30T15:51:06.000000Z
字数 2677
阅读 2232
《PHP核心技术与最佳实践》 - 读书笔记
读书笔记
1 面向对象思想的核心概念
1.0 面向对象的核心思想
- 对象、封装、可重用性和可扩展性
1.1 面向对象的“形”与“本”
- 类是对象的抽象组织,对象是类的具体存在
对象
和类
的概念以及二者之间的关系
- 类是定义一系列属性和操作的模板,而对象则把属性进行具体化,然后交给类处理。
- 对象就是数据,对象本身不包含方法。但是对象有一个“指针”指向一个类,这个类里可以有方法。
- 方法描述不同属性所导致的不同表现。
- 类和对象是不可分割的,有对象就必定有一个类和其对应,否则这个对象也就成了没有亲人的孩子。
1.2 魔术方法的应用
魔术方法
是以两个下划线开头,可以看做 PHP 的语法糖
- 语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法。PHP 里的引用、SPL 等都属于语法糖。
PHP提供的“重载”指动态的“创建”类属性和方法。因此,__set 和__get 方法被归到重载里
- 当调用一个不可访问的方法(如未定义,或者不可见)时,__call()会被调用
- 实际上,__toString 方法也是一种序列化
1.3 继承与多态
- 继承是一种“是、像”的关系,而组合是一种“需要”的关系
- 低耦合指模块与模块之间,尽可能的使模块间独立存在;模块与模块之间的接口尽量少而简单。
- 继承存在的问题
- 继承破坏封装性
- 继承是紧耦合的
- 继承扩展复杂
- 不恰当的使用继承可能违反现实世界中的逻辑
- 组合的缺点
- 在创建对象时,组合需要一一创建局部对象,这一定程度上增加了代码
- Traits 可以方便我们实现对象的扩展,是除 extend、implements 外的另一种扩展对象的方式
- 多态的含义
- 多态指同一类的对象在运行时的具体化
- PHP 语言是弱类型的,实现多态更简单、更灵活
- 类型转换不是多态
- PHP 中父类和子类看做“继父”和“继子”关系,它们存在继承关系,但不存在血缘关系。因此子类无法向上转型为父类,从而失去多态最典型的特征
- 多态的本质就是 if...else,只不过实现的层级不同
1.4 面向接口编程
- 接口定义一套规范,描述一个“物”的功能,要求如果现实中的“物”想成为可用,就必须实现这些基本功能。接口这样描述自己:“对于实现我的所有类,看起来都应该像我现在这个样子”
- 接口为抽象而生
- PHP 中,接口的语义是有限的,使用接口的地方并不多,PHP 中接口可以淡化为
设计文档
,起到一个团队基本契约
的作用。
Traits
可以被视为一种加强型的接口。Traits 和接口很像,不同的是 Traits 是可以导入包含代码的接口。
- 接口的几个概念
- 接口作为一种规范和契约存在
- 接口只是一个声明
- PHP 的接口存在两个不足,一是没有契约作用,二是缺少足够多的内部接口
1.5 反射
- 反射指在 PHP 运行状态中,扩展分析 PHP 程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
- 反射可以用于
文档生成
- 用到反射的地方不多:一个是对对象进行调试,另一个是获取类的信息
1.6 异常和错误处理
- PHP 里的异常,是程序运行中不符合预期的情况及与正常流程不同状况
- 在 PHP 里,遇到任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,会同时抛出异常和错误)
- PHP 一旦遇到非正常代码,通常都会
触发错误
,而不是抛出异常
- PHP 只有
手动抛出异常
后才能捕获异常
- 异常处理机制可以把每一件事当做事务考虑,还可以把异常看成一种内建的恢复系统
- PHP 中的错误级别
- deprecated ,不推荐,不建议
- notice,一般告诉你语法中存在不当的地方,这种错误不影响 PHP 正常流程
- warning,语法中出现很不恰当的错误,需要修改代码
- fetal error,致命错误,这种问题非改不可
- prase error,语法解析错误
1.7 本章小结
- 到底面向过程和面向对象孰优孰劣呢?
二者间并无高低优劣之别,它们各有优劣
- 函数式编程
2 面向对象的设计原则
2.1 面向对象设计的五大原则
2.1.1 单一职责原则(Single Pesponsibility Principle,SRP)
- 一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多责任
- 可以减少类之间的耦合,提高类的复用性
- 工厂模式允许你在代码执行时实例化对象
- 命令模式也是 SRP 的体现,命令模式分离“命令的请求者”和“命令的实现者”方面的职责
- 代理模式也体现了 SRP
- SRP 不只是对类设计有意义,对以模块、子系统为单位的系统架构设计同样有意义
2.1.2 接口隔离原则(Interface Segregation Principle,ISP)
- 客户端不应该是被迫实现一些他们不会使用的接口
- 一个类对另一个类的依赖性应当是建立在最小的接口上的
- 接口污染就是为接口添加不必要的职责
- “接口隔离”其实就是定制化服务设计的原则,使用接口的多重继承实现对不同的接口的组合,从而对外提供组合功能 -- 达到“按需提供服务”
- 对于接口的污染
2.1.3 开放-封闭原则(Open-Close Principle,OCP)
- Open,模块的行为必须是对外开放的、支持扩展的,而不是僵化的
- Closed,在对模块的功能进行扩展时,不应该影响或大规模的影响已有的程序模块
- 核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定
- 在设计方面充分应用“抽象”和“封装”的思想
- 在系统功能编程方面应用面向接口的编程
2.1.4 里式替换原则(Liskov Substitution Principle,LSP)
- 子类必须能替换成他们的基类
- 子类型必须能够替换掉他们的父类型、并出现在父类能够出现的任何地方。它指导我们如何正确的进行继承与派生,并合理的重用代码
- LSP 主要是
针对继承
的设计原则
- 如何遵守该设计原则呢?
- 父类的方法都要在之类中实现或重写,并且派生类只实现其抽象类中声明的方法,而不应当给出多余的方法定义或实现
- 在客户端程序中只应该使用父类对象而不应当直接使用之类对象,这样可以实现运行期绑定(动态多态)
- PHP 对 LSP 的支持并不好,缺乏向上转型等概念
2.1.5 依赖倒置原则(Dependence Inversion Principle,DIP)
- 上层模块不应该依赖下层模块,它们共同依赖于一个对象(父类不能依赖子类,它们都要依赖抽象类)
- 抽象不能依赖于具体,具体应该依赖于抽象
- 专门由一个程序检测配置是否正确(如所依赖的类文件是否存在)以及加载配置所依赖的实现,这个检测程序,就称为
IOC容器
- 一般认为,
依赖注入
(DI)和依赖查找
(DS)是 IOC 的两种实现
2.3 面向对象的思考
- PHP 不是一门很好的面向对象的语言,因为其无法做到完全面向对象,也无法优雅实现面向对象。
- 在 PHP 的开发中应该灵活使用面向对象的特性和设计原则