gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:54:14 25 4
gpt4 key购买 nike

我一直怀疑 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 正在实例化一个新对象。

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

请不要用所有你认为单例不好的理由来回应。我已经熟悉这些谈话要点。

提前致谢!

最佳答案

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

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

关于php - 为什么每次运行调用 Foo::getInstance() 的脚本时,PHP 都会创建一个新的单例实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17560717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com