PHP设计模式之单例

单例关键点
  1. Preferences对象应该可以被系统中的任何对象使用;
  2. Preferences对象不应该被存储在会被覆写的全局变量中;
  3. 系统中不应超过一个Preferences对象。
实现
class Preferences
{
    private $_props = array();
    private static $_instance;

    private function __construct(){}

    public static function getInstance() 
    {
        if (empty(self::$_instance)) {
            self::$_instance = new Preferences();
        }
        return self::$_instance;
    }

    public function setProperty($key, $val) 
    {
        $this->_props[$key] = $val;
    }

    public function getProperty($key)
    {
        return $this->_props[$key];
    }
}

$pref = Preferences::getInstance();
$pref->setProperty('name','Bob');

unset($pref); // 移除引用

$pref2 = Preferences::getInstance();
print $pref2->getProperty('name');
  • $_instance属性设置为private及static,因此不能在类外部被访问。而getInstance()方法在类内部,因此可以访问$_instance属性。因此getInstance()方法是public且static的,所以在脚本的任何地方都可以被调用。
  • 使用单例对象和使用全局变量相比:
    • 单例和全局变量都可以被误用。因为单例在系统的任何地方都可以被访问,所以它们可能会导致很难调试的依赖关系。如果改变一个单例,那么所有使用该单例的类可能都会受到影响
    • 在面向对象的开发环境中,单例模式是一种对于全局变量的改进。你无法用错误类型的数据覆写一个单例。

你可能感兴趣的:(深入PHP)