PHP的单例模式

单例模式,顾名思义强调的是单一,只有一个实例,而且自行实例化并向整个系统提供这个实例。

条件3点:
1、需要一个静态变量,保存类的唯一实例。
2、需要一个公共静态方法,返回唯一实例的一个引用。
3、构造函数(__construct)、克隆函数(__clone)私有化,从而防止外部程序 new 类,从而失去单例模式的意义。

这里说明一下第3点。
如果不声明私有的构造函数,那么可以通过new实例化类调用相应的方法。

class test{

    static private $_instance = null;

    static public function getInstance() {
        if (is_null(self::$_instance) || !isset(self::$_instance)) {
            self::$_instance = new self();
        }
        
        return self::$_instance;
    }
    
    public function testA() {
    
        echo 'test is done!';
    }
}

$a = new test;
$a->testA();

如果不声明私有的克隆函数,那么可以通过克隆一个类的示例来调用原类的方法。

class test{

    static private $_instance = null;

    static public function getInstance() {
        if (is_null(self::$_instance) || !isset(self::$_instance)) {
            self::$_instance = new self();
        }
        
        return self::$_instance;
    }
    
    public function testA() {
    
        echo 'test is done!';
    }
}

$a = test::getInstance();
$b = clone $a;
$b->testA();

优点:
1、节省系统资源,避免重复实例化,是一种“计划”生育。
2、避免大量的new 操作。例如,数据库应用。一个系统程序,会存在大量的数据库操作,如果使用单例模式,就可以避免大量new 操作。
3、如果系统中需要一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现。这个可以参看zend framework 的frontController部分。
4、便于调试,管理,因为所有代码 都集中在一个类里。我们可以在类中设置钩子,输出日志,从而避免 到处 var_dump,echo

缺点:
众所周知,php语言是一种解释型脚本语言,这种运行机制使得每个php页面被解释执行后,所有的相关资源都会被收回。也就是说,php在语言级别上没办法使某个对象常驻内存。
这与asp.net、java等编译型是不同的。然而php,所有的变量无论是全局变量还是静态变量,静态成员都是页面级的。
每次页面执行时,都会重新建立新的对象,都会在页面执行完毕后被清空。
这样似乎php单例模式没什么意义了,所以php的单例模式是针对单次页面级同时出现多个应用场景并需要共享同一对象资源时,是非常有意义的。

本文参考资料:http://blog.csdn.net/calllmq/article/details/7347736

标签: none

添加新评论