class DbConn { static $instance = false;
private function __construct() {}
public function getInstance() { if (!DbConn::$instance) { DbConn::$instance = new DbConn; } return DbConn::$instance; } }
|
组合使用静态方法和静态变量保持这个实例,并且设置构造函数为私有,例化类而创建实例,这个类就不能被直接实例化。
Monostate Pattern(单态模式):类单件模式
class ApplicationConfig { var $_state;
function ApplicationConfig() { $key = '__stealth_singleton_state_index__'; if (!(array_key_exists($key, $GLOBALS) && is_array($GLOBALS[$key]))) { $GLOBALS[$key] = array(); }
$this->_state =& $GLOBALS[$key]; }
function set($key, $val) { $this->_state[$key] = $val; }
function get($key) { if (array_key_exists($key, $this->_state)) { return $this->_state[$key]; } } }
|
在PHP中,通过把一个全局变量绑定到一个实例变量来实现MonoState。
这个技巧的核心是$this->state =& $GLOBALS[$key]; 。在确定$GLOBALS[$key]是一个数组后,代码绑定一个全局数组的引用给类变量$this->state。从而,任何$this->state的改变都自然而言地同步到全局数组,包括类的其它实例。
这个技巧能够在任何PHP的自动全局(superglobal)数组使用,尤其在用户消息队列$_SESSION中有很显著的效果。MonoState能通过你的代码为用户存储一系列的使用信息(要显示的信息可能是从另外一个页面传入的)。
资料:
阅读(2080) | 评论(0) | 转发(0) |