日期:2014-05-16  浏览次数:20407 次

对单例对象的一点疑惑

static function instance($type = 'op')
    {
        $class = 'blog';
        if (!isset(self::$_instance)) {
            $_tmp = new $class();
            self::$_instance = $_tmp;
            $tmp = null;
        }
        return self::$_instance;
    }

同一个页面不断通过刷新页面请求此单例对象。是否没刷新一次就重新创建一个单例实例?
能否根据传入TYPE不同,而创建不同的实力。 那么  isset(self::$_instance)这里该怎么写

------解决方案--------------------
在你贴出的代码中,并没有看到参数 $type 被使用
所以无法讨论这个参数相关的话题

单例在整个程序运行过程中,值保持一个实例(无论实例化多少次)
单例一般用于在对象间传递数据,从而使算法与数据分离
------解决方案--------------------
服务器接到一个连接请求,就产生一个线程,这个线程调用php(或其他语言),向客户端传输,断开连接,结束线程
刷新是一次连接请求过程,自然就是一个新线程
由于
1.php无线程间通信,各连接线程独立,所以即使同一个程序/脚本,都是各自运行
2.最重要一点,上述的线程,其实都是apache(或其他服务器)的线程,根本和php没什么关系,举个例子就相当于开了N个浏览器,都看同一个网页,但任一个都不能自行获取另一个的内容一样
------解决方案--------------------
单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。
------解决方案--------------------
 PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。