那些PHP中常用的设计模式
做过几年php开发的道友,多多少少都会使用或接触几种设计模式,可能只是懂得代码的设计逻辑却不一定知道相应的术语。
/**
* 单例模式: 常用在数据库连接中
* 完整的单例,从各个角度防止创建出第二个实例
*/
class DataBase
{
// 唯一的实例化变量
private static $instance;
// 构造函数声明为 private 后使用new实例化该类会报错
private function __construct()
{
}
// 获取该类的唯一方式
public static function getInstance()
{
// 检测是否已经实例化
if(!isset(self::$instance)){
self::$instance = new self();
}
return self::$instance;
}
// 阻止用户复制对象实例
private function __clone()
{
}
// 防止反序列化
private function __wakeup()
{
}
}
// 使用
DataBase::getInstance()
/**
* 适配器模式:PDO的实现方式既是如此
* 在php中就是 interface (语法:接口)的常用形态
* 实现不同底层封装成统一调用方式
*/
// 定义一个接口,既是定义一种规则,所有继承该接口的类都要遵守该规则
interface IDatabase
{
function connect($host, $user, $passwd, $dbname);
function query($sql);
function close();
}
// 不同的类继承上面接口
class MySQLi implements IDatabase
{
function connect($host, $user, $passwd, $dbname)
{
// 必须实现
}
function query($sql)
{
// 必须实现
}
function close()
{
// 必须实现
}
}
// 同样继承接口
class Redis implements IDatabase
{
function connect($host, $user, $passwd, $dbname)
{
// 必须实现
}
function query($sql)
{
// 必须实现
}
function close()
{
// 必须实现
}
}
// 执行时选择一种
$db = new MySQLi();
// 或者
$db = new Redis();
// 使用
$db->connect('127.0.0.1', 'root', '123456', 'Test');
/**
* 注册模式:解决全局共享和交换对象
* 将所有需要共享的对象都注册到全局树上,实现在任何位置访问
*/
class Register
{
// 将对象按照一定规则保存到一个数组中
private static $objects;
// 将对象注册到全局数上
public static function set($alias, $object)
{
self::$objects[$alias] = $object;
}
// 获取某个注册数上的对象
public static function get($name){
return self::$objects[$name];
}
// 移除某个注册数上的对象
public static function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
// 需要注册的类
class Test
{
}
// 使用
Register::set(Test::class, new Test);
$test = Register::get(Test::class);
/**
* 工厂模式: 一处修改即可更改所有实现
* 需要更改实例化的类时,只需要更改该工厂对应的方法即可,不需要逐一寻找代码中具体实例化的地方
*/
class Factory
{
// 创建猫实例
public static function createCat()
{
return new Cat();
}
// 创建狗实例
public static function createDog()
{
return new Dog();
}
}
// 猫类
class Cat
{
}
// 狗类
class Dog
{
}
// 使用
Factory::createCat();
Factory::createDog();
// 定义接口
abstract class Strategy
{
abstract function goSchool();
}
// 不同类实现统一方法
class Run extends Strategy
{
public function goSchool()
{
// ...
}
}
// 不同类实现统一方法
class Subway extends Strategy
{
public function goSchool()
{
// ...
}
}
// 不同类实现统一方法
class Bike extends Strategy
{
public function goSchool()
{
// ...
}
}
/**
* 策略模式: 避免使用多重条件转移语句
* 定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换
*/
class Context
{
// 执行时选择具体的策略
public static function goSchool(Strategy $strategy)
{
return $strategy->goSchool();
}
}
// 使用
Context::goSchool(new Bike());
想要了解更多关于PHP的设计模式,可以查阅 PHP 设计模式全集