@Chiang
2019-12-30T08:15:18.000000Z
字数 3601
阅读 672
设计模式
- 单例模式是设计模式中最简单的形式之一,我们首先来了解一下PHP如何实现单例模式,三私一公是什么鬼?四私一公又是什么鬼?
- 常用实例有MySQL的DB类
- public 公共的,当前类内,继承链类内和类外都可以访问
- proteced 受保护的,当前类内以及继承链上的类内可以被访问到
- private 私有的,只有当前类内可以被访问到
私有化构造方法
<?php/*** User: lufei* Date: 2019/9/12* Email: lufei@swoole.com*/namespace Luffy\DesignPatterns\Singleton;/*** Class MySQLDB* @package Luffy\DesignPatterns\Singleton*/class MySQLDB{/*** 1. 私有化构造方法 防止使用 new 创建多个实例* MySQLDB constructor.*/private function __construct(){}}$db1 = new MySQLDB();$db2 = new MySQLDB();var_dump($db1,$db2);
- 静态? 没有办法得到一个对象(私有化了构造方法,没有办法实例化一个对象),只能通过类来访问方法
- 公共? 类外访问
<?php/*** User: lufei* Date: 2019/9/12* Email: lufei@swoole.com*/namespace Luffy\DesignPatterns\Singleton;/*** Class MySQLDB* @package Luffy\DesignPatterns\Singleton*/class MySQLDB{/*** 2. 增加静态公共方法*/public static function getInstance(){// 返回一个新对象return new self;}/*** 1. 私有化构造方法 防止使用 new 创建多个实例* MySQLDB constructor.*/private function __construct(){}}// 如果想得到一个对象,就必须通过类名调用getInstance静态方法$db1 = MySQLDB::getInstance();// 反复调用 依旧创建多个对象$db2 = MySQLDB::getInstance();var_dump($db1, $db2);
实现对象单一性
<?php/*** User: lufei* Date: 2019/9/12* Email: lufei@swoole.com*/namespace Luffy\DesignPatterns\Singleton;/*** Class MySQLDB* @package Luffy\DesignPatterns\Singleton*/class MySQLDB{/*** 增加私有的静态属性* @var*/private static $instance;/*** 2. 增加静态公共方法*/public static function getInstance(){/*** instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例* @link https://www.php.net/manual/zh/language.operators.type.php*/if (!self::$instance instanceof self) {static::$instance = new self();}return static::$instance;}/*** 1. 私有化构造方法 防止使用 new 创建多个实例* MySQLDB constructor.*/private function __construct(){}}// 如果想得到一个对象,就必须通过类名调用getInstance静态方法$db1 = MySQLDB::getInstance();$db2 = MySQLDB::getInstance();var_dump($db1, $db2);
- 私有化克隆方法
- 阻止克隆获取新的对象
<?php/*** User: lufei* Date: 2019/9/12* Email: lufei@swoole.com*/namespace Luffy\DesignPatterns\Singleton;/*** Class MySQLDB* @package Luffy\DesignPatterns\Singleton*/class MySQLDB{/*** 增加私有的静态属性* @var*/private static $instance;/*** 2. 增加静态公共方法*/public static function getInstance(){/*** instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例* @link https://www.php.net/manual/zh/language.operators.type.php*/if (!self::$instance instanceof self) {static::$instance = new self();}return static::$instance;}/*** 1. 私有化构造方法 防止使用 new 创建多个实例* MySQLDB constructor.*/private function __construct(){}// 4. 私有化__clone魔术方法private function __clone(){}}// 如果想得到一个对象,就必须通过类名调用getInstance静态方法$db1 = MySQLDB::getInstance();$db2 = MySQLDB::getInstance();var_dump($db1, $db2);
反序列化的时候会重新加载对象
<?php/*** User: lufei* Date: 2019/9/12* Email: lufei@swoole.com*/namespace Luffy\DesignPatterns\Singleton;/*** Class MySQLDB* @package Luffy\DesignPatterns\Singleton*/class MySQLDB{/*** 增加私有的静态属性* @var*/private static $instance;/*** 2. 增加静态公共方法*/public static function getInstance(){/*** instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例* @link https://www.php.net/manual/zh/language.operators.type.php*/if (!self::$instance instanceof self) {static::$instance = new self();}return static::$instance;}/*** 1. 私有化构造方法 防止使用 new 创建多个实例* MySQLDB constructor.*/private function __construct(){}// 4. 私有化__clone魔术方法private function __clone(){}//5.将__wakeup()方法私有化private function __wakeup(){// TODO: Implement __wakeup() method.}}// 如果想得到一个对象,就必须通过类名调用getInstance静态方法$db1 = MySQLDB::getInstance();$db2 = MySQLDB::getInstance();var_dump($db1, $db2);// 反序列化对象$db4 = unserialize(serialize($db1));var_dump($db4);
- 私有化构造方法: 防止使用new创建多个实例
- 公共的静态方法: 进入类的内部
- 私有化静态属性: 防止直接访问存储实例的属性
- 私有化克隆方法: 防止克隆多个实例
- 私有化构造方法: 防止使用new创建多个实例
- 公共的静态方法: 进入类的内部
- 私有化静态属性: 防止直接访问存储实例的属性
- 私有化克隆方法: 防止克隆多个实例
- 私有化__wakeup()方法: 防止反序列
