PHP设计模式之单例模式

在程序运行时,某个类通过内部实现,最终只会向整个系统提供唯一的实例。这样的设计被称为单例模式。

 

实现单例模式,需要满足以下几点要求:

  在类中自行创建实例

  自行向整个系统提供该实例

  该实例在整个系统中必须是唯一的

 

直接贴代码会比较直观:

<?php
/**
* Class Singleton
*/
class Singleton
{
/**
* 用于存储实例的变量
* 声明为静态变量,以供当前类共享该变量
* 声明为私有变量,以避免被外部篡改
*/
private static $_instance;

/**
* 构造函数
* 声明为私有函数,以避免外部直接实例化当前类
*/
private function __construct()
{
}

/**
* 魔术方法clone
* 声明为私有函数,以阻止克隆
*/
private function __clone()
{
}

/**
* 实例化当前类
* 提供给外部实例化当前类的唯一方式
* @return Singleton
*/
public static function instance()
{
if (!isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}

//用于测试的变量
private $_testvar = 1;

/**
* @param $num
* @return $this
*/
public function setTestvar($num)
{
$this->_testvar = $num;
return $this;
}

/**
* @return int
*/
public function getTestvar()
{
return $this->_testvar;
}
}

// 下面将得到 Singleton 类的单例对象
//第一次通过instance获取 Singleton 实例,并改变其testvar属性的值
$singleton = Singleton::instance();
$singleton->setTestvar(3);
var_dump($singleton->getTestvar());

//第二次通过instance获取 Singleton 实例,即为第一次获取的实例,因此testvar为之前改动后的值
$singletonTwo = Singleton::instance();
var_dump($singletonTwo->getTestvar());

//外部无法通过new来实例化 Singleton 类
//$singleton = new Singleton;

//外部无法通过clone来复制 Singleton 实例
$singletonClone = clone $singleton;

嗯,这个就是php单例模式了!

 

posted @ 2018-12-20 17:03  阿沐66  阅读(107)  评论(0)    收藏  举报