为什么每次运行调用Foo :: getInstance()的脚本时PHP都会创建一个单例的新实例?

时间:2013-07-10 00:51:57

标签: php singleton

我怀疑PHP单身人士不是真正的单身人士,所以我做了一个测试。我创建了以下类:

class MySingleton {


    private static $instance;


    private function __construct()
    {
        error_log("I am a new instance of MySingleton. I was instantiated at " . time());
    }


    private function __clone(){}


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

}

接下来,我创建了一个名为test.php的文件:

require('MySingleton.php');

$foo = MySingleton::getInstance();
$bar = MySingleton::getInstance();
$baz = MySingleton::getInstance();

当我在我的localhost上运行test.php脚本时,我在Apache错误日志中得到一个条目,这使它看起来像它应该做的那样。但是,每次我在浏览器中刷新页面时,我都会在错误日志中找到另一个条目,这意味着PHP正在实例化一个新对象。

我能做些什么来让这个类返回对象的持久单实例吗? (即单身人士假设要做什么)。

请不要回答你认为单身人士不好的所有原因。我已经熟悉了这些话题。

提前致谢!

2 个答案:

答案 0 :(得分:14)

PHP无国籍。在每个请求中,应用程序都会被构建并拆除。在这种情况下,您的单例在整个应用程序过程中只实例化一次 - 即每次请求一次。

与Java相比,你有一台服务器,比如Tomcat或Jetty,可以将对象加载到内存中。在这种情况下,您的单例将在多个请求中存活...直到服务器重新启动。

答案 1 :(得分:3)

在PHP中,单例对象一直存在,直到脚本存在。这里发生的是一旦你的请求完成,脚本就会死掉。对于第二个请求,它会创建一个新的脚本实例,从而创建一个新的MySingleton对象。

相关问题