@Chiang
2019-12-30T16:15:18.000000Z
字数 3601
阅读 495
设计模式
- 单例模式是设计模式中最简单的形式之一,我们首先来了解一下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()方法: 防止反序列