设计模式中的单例模式核心在“单”上。即:一个对象只负责一个任务。
优点:
·单例模能减少new操作消耗资源 ·很方便的实现单文件控制,如载入配置文件;· 在一个页面请求中便于调试;
缺点:
PHP的所有变量都是页面级的,每次页面执行时会重新建立新的对象,页面执行完毕后会被清空;所以单例模式只针对单次页面请求时有多个应用场景并需要共享同一对象资源时候有意义。
要点:
· 构造函数需要设置为private(做到访问控制,防止外部代码用new来创建对象),单例类只能被自身实例化,不能被外部代码实例化,所以用private屏蔽外来代码;
private function __construct()
{
$this->_db = pg_connect(‘xxxx’);
}
· 要拥有一个静态成员变量,用来保存实例化后的类;
private static $_instance;
· 要拥有一个公共的静态方法,用来访问这个实例(一般情况会用getInstance()方法进行实例化,通过instanceof操作符可以检测到类是否已经被实例化)
public static function getInstance()
{
if(! (self::$_instance instanceof self) )
{
self::$_instance = new self();
}
return self::$_instance;
}
· 需要创建__clone()方法防止对象被复制(用来覆盖__clone 方法,从而做到防止被克隆)
private function __clone()
{
}
引用实例:
<?php
/1**
*
*
*
*
*
*
*
*
*
*
*
*/
class
//保存类实例的静态成员变量
private
//private标记的构造方法
private
echo
}
//创建__clone方法防止对象被复制克隆
public
trigger_error(‘Clone
}
//单例方法,用于访问实例的公共的静态方法
public
if(!(self::$_instance
self::$_instance
}
return
}
public
echo
}
}
//用new实例化private标记构造函数的类会报错
//$danli
//正确方法,用双冒号::操作符访问静态方法获取实例
$danli
$danli->test();
//复制(克隆)对象将导致一个E_USER_ERROR
$danli_clone
如需转载请注明: 转载自26点的博客
本文链接地址: 设计模式之单例模式 PHP版
转载请注明:26点的博客 » 设计模式之单例模式 PHP版
以U哦加厚