某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。清单 3 中的代码显示了 PHP V5 中的一个数据库连接单元素。

在程序中,只允许出现一个该对象

 

class Single
{
    public $dbName;
    private static $instance = null;

    private function __construct()
    {
        echo "hello singe<br/>";
    }

    function __destruct()
    {
        echo "see you tomorrow<br/>";
    }

    public static function getInstance()
    {
        if(!self::$instance instanceof self){
            self::$instance = new Single();
        }
        return self::$instance;
    }

    public static function freeSelf()
    {
        self::$instance = null;
    }

    public function printInfo()
    {
        echo "this is a single<br/>";
    }

    public function printName()
    {
        echo "this is a name<br/>";
    }

    public function setDbName($dbName)
    {
        $this->dbName = $dbName;
    }

    public function getDbName()
    {
        return $this->dbName;
    }
}
$a = Single::getInstance();
$a->setDbName("hello");
echo $a->getDbName()."<br/>";

 

 

要点:
 1. $instance必须声明为静态的私有变量 
 2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去单例模式的意义 
 3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用 
 4. ::操作符只能访问静态变量或静态函数 
 5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。 
  也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量, 
  还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。 
  不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复 

posted on 2016-07-20 10:55  Sign_Black  阅读(223)  评论(0编辑  收藏  举报