Я подозревал, что в то время как синглтоны PHP не являются реальными синглонами, поэтому я сделал тест. Я создал следующий класс:Почему PHP создает новый экземпляр singleton каждый раз, когда запускается скрипт, вызывающий Foo :: getInstance()?
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, мне пришлось бы сериализовать экземпляр и сохранить его в кэше пользователей APC. Тогда метод getInstance() будет проверять кеш вместо проверки self :: $ instance. Тем не менее, это кажется довольно сочным. –