PHP设计模式:单例模式
简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;
使用类(class)来实现:
1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2、拥有一个保存类的实例的静态成员变量。
3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)。
另外,需要创建__clone()方法防止对象被复制(克隆)。在其他语言比如Java中是没有这种方法,所以这时php的特别之处。
为什么要使用PHP单例模式?
1、一般情况下,php应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现。
示例如下:
<?php
/**
* 服务器请求处理类
*
* TODO getSiteUrl
* @package Request
*/
class Typecho_Request
{
/**
* 单例句柄
*
* @access private
* @var Typecho_Request
*/
private static $_instance = NULL;
/**
* 构造方法
*
* @access private
*/
private function __construct() {
}
/**
* 构造方法
*
* @access private
*/
private function Typecho_Request() {
}
/**
* 获取单例句柄
*
* @access public
* @return Typecho_Request
*/
public static function getInstance()
{
if (NULL === self::$_instance) {
self::$_instance = new Typecho_Request();
}
return self::$_instance;
}
/**
* 在克隆方法中进行提示
*
* @access public
* @return void
*/
public function __clone() {
//这个根据需要进行
trigger_error("The class does't allows clone.", E_USER_ERROR);
}
}
$request = Typecho_Request::getInstance();
var_dump($request); //echo object(Typecho_Request)[1]
$request_new = new Typecho_Request();
var_dump($request_new); //error
$request_clone = clone $request;
var_dump($request_bak); //error
?>
