Как сделать одиночку (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 — Проверяет, определён ли класс.