韩天峰的《大话 PHP 设计模式》学习笔记
视频地址:Rango - 大话PHP设计模式 - imooc.com
一、什么是设计模式
- 什么是设计模式:前人的经验总结,如果把编程比作武林,那设计模式就是武林秘籍
- 课程内容:
- PHP 面向对象的高级特性
- 十一种设计模式
- 课程目标:
- 掌握 PHP 各类设计模式
- 具备设计纯面向对象框架和系统的能力
二、开发环境
- Phpstorm
- Source Code Pro 字体
三、命名空间
- 作用和目的:解决命名冲突,方便管理代码
- 实现
- spl_autoload_register()
- composer 自动生成
四、链式操作的实现
一行代码实现多行代码的功能
$db->where('name', 'sakuya')->where('sex', 1)->first();
关键是 return $this
五、PHP 魔术方法
__get
/__set
:属性接管__call
/__callstatic
:控制方法调用__toString
:当对象被当作字符串时-
__invoke
:将对象当成一个函数执行的时候会回调<?php class CallableClass { function __invoke($x) { var_dump($x); } } $obj = new CallableClass; $obj(5); var_dump(is_callable($obj)); \\ int(5) \\ bool(true)
六、常见设计模式
工厂模式
用工厂方法或类来生成对象,而不是在代码中直接 new Class()
,替换new Class()
这种写法
好处是如果生成对象的方式发生改变,比如构造参数改变,直接修改工厂方法就行了
单例模式
使某个类的对象只允许创建一个
比如数据库类,数据库的连接只需要连接一次
注册模式
解决全局变量共享问题和交换对象
可以理解成用一个类来存放全局变量
适配器模式
可以将截然不同的函数接口封装成统一的 API
比如多种数据库的连接方法不同,通过这个模式封装成统一的 API
策略模式
将一组特定的行为和算法封装成类,以适应某些特定的上下文环境
数据对象映射模式
将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作
例子:ORM
观察者模式
当一个对象状态发生改变时,依赖它的对象全不会收到通知,并自动更新
场景:一个事件发生后,要执行一连串的更新操作,传统的编程方式,就是在事件的代码之后直接加入处理逻辑当更新的逻辑增多之后,代码变得难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码
观察者模式实现了低耦合、非侵入式的通知与更新机制
原型模式
- 与工厂模式类似,都是用来创建对象
- 与工厂模式不同的地方是,原型模式是先创建好一个原型对象,然后通过
clone
原型对象的方式,来创建新的对象,这样就免去了类创建时重复的初始化操作 - 原型模式适用于大对象的创建创建一个大对象需要很大的开销,如果每次
new
就会消耗很大,原型模式仅需内存拷贝即可
装饰器模式(Decorator)
- 可以动态地添加修改类的功能
- 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现该类的方法
- 使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可实现最大的灵活性
迭代器模式
在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素
实现 Iterator
接口即可
代理模式
在客户端和实体之间建立一个代理对象,客户端对实体的操作全部委派给代理对象,隐藏实体的具体实现细节