# PHP 设计模式 **Repository Path**: xialijun/php-design-pattern ## Basic Information - **Project Name**: PHP 设计模式 - **Description**: 设计模式的练习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 跟大神学习设计模式 # 设计模式 主要是将设计模式 活学活用 - PHP 面向对象的高级特性 - 11 中 设计模式 - PSR-0 规范 ### 目标 - 掌握 PHP 各类的设计模式 - 具备设计纯面向对象框架和设计能力 ## 面向对象的高级特性 > ### 命名空间 > > `namespace Test;` `__FILE__` 显示当前文件路径 `__METHOD__` 显示方法名 ## 类自动加载函数 `spl_autoload_register('function name')` 自动载入不会发生冲突定义错误 ## PSR-0 规范 , 业界提出的规范 - 命名空间必须与绝对路径一致 - 类名首字母必须大写 - 除了入口文件以外,其他 ".php" 文件,必须且只有一个类 ## 基于 PSR-0 规范开发一个面向对象的基础框架 ## SPL 标准库操作 - SplStack 栈 - SplQueue 队列 - SplMinHeap 最小堆 - SplFixedArray(10) 固定长度数组 ## 链式操作 > 主要就是方法返回 \$this ## 设计模式 #### 基础 - 工程模式 > 工厂方法或者类生成对象,而不是在代码中直接 new - 单例模式 > 使某个类的对象仅允许创建一个 - 注册模式 > 全局共享和交换对象 #### 进阶 - 适配器模式 > 可以将截然不同的函数接口封装成统一的 API > 实际应用举例,PHP 的数据库操作有 mysql , mysqli, pdo3 种,可以用适配器模式统一成一致。类似的场景还有 cache 适配器,将 memcache , redis , file , apc 等不同的缓存函数,统一成一致 - 策略模式 > 将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式特定的上下文环境,这种模式就是策略模式 > 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告 > 使用策略模式可以实现 Ioc,依赖倒置、控制反转 #### 数据对象映射模式 > 数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。 > 在代码中实现数据对象映射模式,我们将实现一个 ORM 类,将复杂的 SQL 语句映射成对象属性的操作。 > 结合使用数据对象映射模式,工厂模式,注册器模式 #### 观察者模式 > 观察者模式( Observer ),当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新 > 场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码 > 观察者模式实现了低耦合,非侵入式的通知与更新机制 #### 原型模式 > 与工厂模式作用类似,都是用来创建对象 > 与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过 clone 原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作 > 原型模式适用于大对象的创建。创建一个大对象需要很大的开销,如果每次 new 就会消耗很大,原型模式仅需内存拷贝即可 > 克隆 clone() 大的对象 减少对象的创建时间及内存,主要用于大的对象创建 #### 装饰器模式 > 装饰器模式(Decorator ),可以动态地添加修改类的功能 > 一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法 > 使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性 #### 迭代器模式 > 在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素. > 相比于传统的编程模式,迭代器模式可以隐藏遍历元素的所需的操作. #### 代理模式 > 在客户端与实体之间建立一个代理对象( proxy ),客户端对实体进行操作全部委派给代理对象,隐藏实体的具体实现细节. > Proxy 还可以与业务代码分离,部署到另外的服务器。业务代码中通过 RPC 来委派任务. > 主要是隐藏实体的具体实现细节 > 读写分离 > master 主库 > slave 从库 - #### 配置与设计模式 > PHP 中使用 ArrayAccess 实现配置文件的加载 > 使用数组的方式实现自动加载配置 > 主要实现 ArrayAccess 接口 ## 实战 - ### 面向对象编程的基本原则 > 单一职责:一个类,只需要做好一件事情。 - 不要使用一个类完成一个很复杂的功能,拆分成更小更具体的类 > 开放封闭:一个类,应该是可扩展的,而不可修改的。 - 一个类实现以后是对扩展开放的,而不是对修改开放的,对修改是封闭的 ,增加功能使用扩展增加功能,而不是使用修改来增加功能 > 依赖倒置:一个类,不应该强依赖另外一个类。每个类对于另外一个类都是可替换的。 > A B 两个类 如果 A 类需要使用 B 类的功能,不应该直接调用 B 类,而是应该使用注入的方式将 B 类注入给 A 类 > 这是对于 A 来说 B 就是可替换的 [观察者模式,装饰器模式,策略模式等] - 配置化:尽可能地使用配置,而不是硬编码。 > 数据参数 尽可能的配置到参数文件中 - 面向接口编程:只需要关心接口,不需要关心实现。 - ### MVC 结构 > 模型-视图-控制器,一种C/S或者B/S软件工程的`组织方式` > 模型(Model) :数据和存储的封装 > 视图(View) :展现层的封装,如Web系统中的模版文件 > 控制器(Controller) :逻辑层的封装 - ### 装饰器模式 观察者模式 代理模式在MVC模式中 如何组合使用