Я подозревал, что в то время как синглтоны 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 является апатридом. По каждому запросу приложение создается и срывается. В этом случае ваш singleton создается один раз в течение всего хода приложения – то есть один раз за запрос.
Сравните это с чем-то вроде Java, где у вас есть сервер, например Tomcat или Jetty, который хранит объекты, загруженные в память. В этой ситуации ваш синглтон сможет выдержать несколько запросов … Пока сервер не перезагрузится.
В PHP одноэлементные объекты живут до тех пор, пока сценарий не будет жить. Что происходит здесь, когда ваш запрос заканчивается, скрипт умирает. И для второго запроса он создает новый экземпляр скрипта, следовательно, новый объект MySingleton.