Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: singleton, pattern

Как реализовать Singleton?

Этот вопрос проверяет знание классической реализации шаблона Одиночка и понимание ее особенностей в PHP.

Короткий ответ

Singleton реализуется путем создания класса, который: 1) объявляет приватное статическое свойство для хранения единственного экземпляра; 2) имеет приватный конструктор, чтобы запретить создание объектов через new; 3) имеет публичный статический метод (часто getInstance()), который создает экземпляр (если он еще не создан) и возвращает его. В многопоточных средах нужно добавлять синхронизацию, но в PHP это обычно не требуется.

Длинный ответ

Реализация Singleton гарантирует, что у класса будет только один экземпляр во время выполнения скрипта.

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

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

    // 2. Приватный конструктор для блокировки создания через new
    private function __construct()
    {
        // Инициализация подключения (например, PDO)
    }

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

    // 4. [Важно] Запрещаем клонирование объекта
    public function __clone()
    {
        throw new \Exception("Cannot clone a singleton.");
    }

    // 5. [Важно] Запрещаем десериализацию
    public function __wakeup()
    {
        throw new \Exception("Cannot unserialize a singleton.");
    }

    // ... остальные методы класса (например, query() и т.д.)
}

// Использование:
$db1 = DatabaseConnection::getInstance();
$db2 = DatabaseConnection::getInstance();

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

Ключевые элементы реализации:

  1. Приватный конструктор: Не позволяет создать экземпляр класса извне с помощью оператора new.

  2. Статический метод getInstance: Контролирует жизненный цикл объекта. При первом вызове создает его, при последующих — возвращает уже существующий.

  3. Запрет клонирования и десериализации: Эти операции могут создать копию объекта, нарушив принцип Singleton. Поэтому методы __clone и __wakeup должны быть объявлены приватными или вызывать исключение.

Вывод: Singleton — это простой, но мощный шаблон для управления единственным экземпляром ресурса. Однако его следует использовать с осторожностью, так как он по сути является глобальной переменной, что может затруднить модульное тестирование и сделать код связанным. Вместо "голого" Singleton в современных фреймворках часто используют контейнер внедрения зависимостей (DI Container), который может управлять жизненным циклом объектов как "одиночек" в более контролируемом виде.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • PHP

    PHP

Ключевые слова

#singleton

#pattern

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.