Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как сделать одиночку (singleton)

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

Закройте конструктор и отдавайте единственный объект статическим методом:

<?php
 
class Config
{
    private static ?Config $instance = null;
 
    private function __construct(public readonly string $env) {}
 
    public static function get(): self
    {
        return self::$instance ??= new self('production');
    }
}
 
var_dump(Config::get() === Config::get());
echo Config::get()->env;

Результат:

bool(true)
production

Почему его избегают

Одиночка — скрытая глобальная переменная: класс, который вызывает Config::get(), нельзя проверить тестом с другими настройками. В современном коде объект создают один раз и передают в конструкторы тех, кому он нужен.

<?php
 
class Config
{
    public function __construct(public readonly string $env) {}
}
 
class Mailer
{
    public function __construct(private Config $config) {}
 
    public function mode(): string
    {
        return $this->config->env === 'production' ? 'real' : 'fake';
    }
}
 
echo (new Mailer(new Config('testing')))->mode();

Результат:

fake

Функции из этого ответа

  • Closure — Класс анонимных функций и замыканий.
  • constant — Возвращает значение константы по её имени в строке.
  • class_exists — Проверяет, определён ли класс.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.