Ответ
Помимо приватного конструктора, для корректной реализации Singleton в PHP необходимо предусмотреть следующие элементы:
- Приватное статическое свойство для хранения единственного экземпляра класса.
- Публичный статический метод (обычно
getInstance()), который контролирует создание и предоставляет доступ к этому экземпляру. - Запрет клонирования объекта через объявление приватного магического метода
__clone(). - Запрет десериализации, которая может создать новый экземпляр, через приватный метод
__wakeup()(в PHP < 8.0) или реализацию интерфейса__serialize()/__unserialize().
Полный пример реализации на PHP:
class DatabaseConnection
{
// 1. Статическое свойство для хранения единственного экземпляра
private static ?self $instance = null;
// 2. Приватный конструктор
private function __construct()
{
$this->connect(); // Инициализация соединения
}
// 3. Публичный статический метод для получения экземпляра
public static function getInstance(): self
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
// 4. Запрет клонирования
private function __clone() {}
// 5. Запрет десериализации (для PHP < 8.0)
public function __wakeup()
{
throw new Exception('Cannot unserialize a singleton.');
}
// Полезная логика класса
private function connect(): void { /* ... */ }
public function query(string $sql): array { /* ... */ }
}
// Использование
$db = DatabaseConnection::getInstance();
$results = $db->query('SELECT * FROM users');
Важно: В современных приложениях Singleton часто считается антипаттерном, так как создает скрытые зависимости и усложняет тестирование. Вместо него предпочтительнее использовать Dependency Injection контейнер, который управляет жизненным циклом объектов.