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

Nei*_*rdi 3 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

require('MySingleton.php');

$foo = MySingleton::getInstance();
$bar = MySingleton::getInstance();
$baz = MySingleton::getInstance();
Run Code Online (Sandbox Code Playgroud)

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

有什么我可以做的不同,使这个类返回一个持久的对象的单个实例?(即单身人士该做什么).

请不要回答你认为单身人士不好的所有原因.我已经熟悉那些谈话要点了.

提前致谢!

Tho*_*ley 14

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

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

  • 有趣(和令人失望)。既然如此,我想为了在 PHP 中有一个真正的单例,我必须序列化实例并将其存储在 APC 用户缓存中。然后 getInstance() 方法将检查缓存而不是检查 self::$instance。不过,这似乎很糟糕。 (2认同)