Чтобы иметь только один экземпляр каждого класса, вы можете создать простой сервисный контейнер.
class ServiceContainer
{
protected $services;
public function get($className)
{
if (!array_key_exists($className, $this->services)) {
$this->services[$className] = new $className;
}
return $this->services[$className]
}
}
Затем создайте один экземпляр ServiceContainer для каждого приложения. Введите контейнер во все ваши контроллеры и используйте
public function someAction()
{
$this->container->get('Mailer')->send($email_data);
}
Простой пример, и для его использования, очевидно, требуется много работы (например, необходима автозагрузка и обработка путей к файлам для простоты использования или более простой способ добавления служб без их получения и т. Д.).