[关闭]
@jtahstu 2017-10-30T07:51:06.000000Z 字数 2677 阅读 119

《PHP核心技术与最佳实践》 - 读书笔记

读书笔记


1 面向对象思想的核心概念

1.0 面向对象的核心思想

  1. 对象封装可重用性可扩展性

1.1 面向对象的“形”与“本”

  1. 类是对象的抽象组织,对象是类的具体存在
  2. 对象的概念以及二者之间的关系
    • 类是定义一系列属性和操作的模板,而对象则把属性进行具体化,然后交给类处理。
    • 对象就是数据,对象本身不包含方法。但是对象有一个“指针”指向一个类,这个类里可以有方法。
    • 方法描述不同属性所导致的不同表现。
    • 类和对象是不可分割的,有对象就必定有一个类和其对应,否则这个对象也就成了没有亲人的孩子。

1.2 魔术方法的应用

  1. 魔术方法是以两个下划线开头,可以看做 PHP 的语法糖

    • 语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法。PHP 里的引用、SPL 等都属于语法糖。
  2. PHP提供的“重载”指动态的“创建”类属性和方法。因此,__set 和__get 方法被归到重载里

  3. 当调用一个不可访问的方法(如未定义,或者不可见)时,__call()会被调用
  4. 实际上,__toString 方法也是一种序列化

1.3 继承与多态

  1. 继承是一种“是、像”的关系,而组合是一种“需要”的关系
  2. 低耦合指模块与模块之间,尽可能的使模块间独立存在;模块与模块之间的接口尽量少而简单。
  3. 继承存在的问题
    • 继承破坏封装性
    • 继承是紧耦合的
    • 继承扩展复杂
    • 不恰当的使用继承可能违反现实世界中的逻辑
  4. 组合的缺点
    • 在创建对象时,组合需要一一创建局部对象,这一定程度上增加了代码
  5. Traits 可以方便我们实现对象的扩展,是除 extend、implements 外的另一种扩展对象的方式
  6. 多态的含义
    • 多态指同一类的对象在运行时的具体化
    • PHP 语言是弱类型的,实现多态更简单、更灵活
    • 类型转换不是多态
    • PHP 中父类和子类看做“继父”和“继子”关系,它们存在继承关系,但不存在血缘关系。因此子类无法向上转型为父类,从而失去多态最典型的特征
    • 多态的本质就是 if...else,只不过实现的层级不同

1.4 面向接口编程

  1. 接口定义一套规范,描述一个“物”的功能,要求如果现实中的“物”想成为可用,就必须实现这些基本功能。接口这样描述自己:“对于实现我的所有类,看起来都应该像我现在这个样子”
  2. 接口为抽象而生
  3. PHP 中,接口的语义是有限的,使用接口的地方并不多,PHP 中接口可以淡化为设计文档,起到一个团队基本契约的作用。
  4. Traits 可以被视为一种加强型的接口。Traits 和接口很像,不同的是 Traits 是可以导入包含代码的接口。
  5. 接口的几个概念
    • 接口作为一种规范和契约存在
    • 接口只是一个声明
    • PHP 的接口存在两个不足,一是没有契约作用,二是缺少足够多的内部接口

1.5 反射

  1. 反射指在 PHP 运行状态中,扩展分析 PHP 程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
  2. 反射可以用于文档生成
  3. 用到反射的地方不多:一个是对对象进行调试,另一个是获取类的信息

1.6 异常和错误处理

  1. PHP 里的异常,是程序运行中不符合预期的情况及与正常流程不同状况
  2. 在 PHP 里,遇到任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,会同时抛出异常和错误)
  3. PHP 一旦遇到非正常代码,通常都会触发错误,而不是抛出异常
  4. PHP 只有手动抛出异常后才能捕获异常
  5. 异常处理机制可以把每一件事当做事务考虑,还可以把异常看成一种内建的恢复系统
  6. PHP 中的错误级别
    • deprecated ,不推荐,不建议
    • notice,一般告诉你语法中存在不当的地方,这种错误不影响 PHP 正常流程
    • warning,语法中出现很不恰当的错误,需要修改代码
    • fetal error,致命错误,这种问题非改不可
    • prase error,语法解析错误

1.7 本章小结

  1. 到底面向过程和面向对象孰优孰劣呢?
    二者间并无高低优劣之别,它们各有优劣
  2. 函数式编程

2 面向对象的设计原则

2.1 面向对象设计的五大原则

2.1.1 单一职责原则(Single Pesponsibility Principle,SRP)

  1. 一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多责任
  2. 可以减少类之间的耦合,提高类的复用性
  3. 工厂模式允许你在代码执行时实例化对象
  4. 命令模式也是 SRP 的体现,命令模式分离“命令的请求者”和“命令的实现者”方面的职责
  5. 代理模式也体现了 SRP
  6. SRP 不只是对类设计有意义,对以模块、子系统为单位的系统架构设计同样有意义

2.1.2 接口隔离原则(Interface Segregation Principle,ISP)

  1. 客户端不应该是被迫实现一些他们不会使用的接口
  2. 一个类对另一个类的依赖性应当是建立在最小的接口上的
  3. 接口污染就是为接口添加不必要的职责
  4. “接口隔离”其实就是定制化服务设计的原则,使用接口的多重继承实现对不同的接口的组合,从而对外提供组合功能 -- 达到“按需提供服务”
  5. 对于接口的污染
    • 利用委托分离接口
    • 利用多继承分离接口

2.1.3 开放-封闭原则(Open-Close Principle,OCP)

  1. Open,模块的行为必须是对外开放的、支持扩展的,而不是僵化的
  2. Closed,在对模块的功能进行扩展时,不应该影响或大规模的影响已有的程序模块
  3. 核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定
  4. 在设计方面充分应用“抽象”和“封装”的思想
  5. 在系统功能编程方面应用面向接口的编程

2.1.4 里式替换原则(Liskov Substitution Principle,LSP)

  1. 子类必须能替换成他们的基类
  2. 子类型必须能够替换掉他们的父类型、并出现在父类能够出现的任何地方。它指导我们如何正确的进行继承与派生,并合理的重用代码
  3. LSP 主要是针对继承的设计原则
  4. 如何遵守该设计原则呢?
    • 父类的方法都要在之类中实现或重写,并且派生类只实现其抽象类中声明的方法,而不应当给出多余的方法定义或实现
    • 在客户端程序中只应该使用父类对象而不应当直接使用之类对象,这样可以实现运行期绑定(动态多态)
  5. PHP 对 LSP 的支持并不好,缺乏向上转型等概念

2.1.5 依赖倒置原则(Dependence Inversion Principle,DIP)

  1. 上层模块不应该依赖下层模块,它们共同依赖于一个对象(父类不能依赖子类,它们都要依赖抽象类)
  2. 抽象不能依赖于具体,具体应该依赖于抽象
  3. 专门由一个程序检测配置是否正确(如所依赖的类文件是否存在)以及加载配置所依赖的实现,这个检测程序,就称为IOC容器
  4. 一般认为,依赖注入(DI)和依赖查找(DS)是 IOC 的两种实现

2.3 面向对象的思考

  1. PHP 不是一门很好的面向对象的语言,因为其无法做到完全面向对象,也无法优雅实现面向对象。
  2. 在 PHP 的开发中应该灵活使用面向对象的特性和设计原则
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注