4

我一直怀疑 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();

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

有什么我可以做不同的事情来让这个类返回一个持久的对象单实例吗?(即单例该做什么)。

请不要以你认为单身不好的所有原因作出回应。我已经熟悉那些谈话要点。

提前致谢!

4

2 回答 2

16

PHP 是无状态的。在每次请求时,应用程序都会被构建和拆除。在这种情况下,您的单例在应用程序的整个过程中只被实例化一次——即每个请求一次。

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

于 2013-07-10T01:03:45.380 回答
4

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

于 2013-07-10T00:59:37.647 回答