Что произойдет при повторном вызове метода getInstance() у Singleton?

«Что произойдет при повторном вызове метода getInstance() у Singleton?» — вопрос из категории Паттерны, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При повторном вызове getInstance() будет возвращен тот же самый экземпляр объекта, который был создан при первом вызове. Новый объект создан не будет. В этом и заключается основная цель паттерна Singleton — гарантировать существование только одного экземпляра класса.

Классическая реализация на PHP:

class DatabaseConnection
{
    // Статическая переменная для хранения единственного экземпляра.
    private static ?self $instance = null;

    // Приватный конструктор блокирует создание через 'new' извне класса.
    private function __construct()
    {
        // Инициализация подключения к БД...
        $this->connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    }

    // Публичный статический метод для получения экземпляра.
    public static function getInstance(): self
    {
        // Проверка: если экземпляр еще не создан, создаем его.
        if (self::$instance === null) {
            self::$instance = new self();
        }
        // Все последующие вызовы вернут уже созданный экземпляр.
        return self::$instance;
    }

    // Другие полезные методы...
    public function getConnection(): PDO
    {
        return $this->connection;
    }
}

// Использование:
$db1 = DatabaseConnection::getInstance(); // Создается новый объект.
$db2 = DatabaseConnection::getInstance(); // Возвращается существующий объект ($db1).

var_dump($db1 === $db2); // bool(true) - это один и тот же объект.

Ключевые моменты:

  • Повторный вызов getInstance() не выполняет код new self(), так как условие self::$instance === null уже ложно.
  • Это обеспечивает глобальный доступ к одному ресурсу (например, подключению к БД, конфигурации, логгеру) без его дублирования в памяти.
  • Важно помнить о потенциальных проблемах Singleton, таких как скрытые зависимости и усложнение тестирования, поэтому его следует использовать обдуманно.