Я бы передал это всем необходимым методам.то есть
function doFoo(Application $app) {
$app->doStuff();
}
И глобальный, и синглтон считаются плохими и слишком сильно связывают ваш код, что затрудняет модульное тестирование.Существует одно правило, когда вам разрешено использовать синглтон, если вы отвечаете «да» на следующее утверждение:
Нужно ли вводить глобальное состояние в мое приложение И у меня должен быть один экземплярданный объект И наличие более одного экземпляра вызовет ошибку
Если вы ответите «да» на все 3 части, вы можете использовать синглтон.В любом другом случае просто передайте все экземпляры всем методам, которым они нужны.Если у вас их слишком много, подумайте о том, чтобы использовать что-то вроде Context
class Context {
public $application;
public $logger;
....
}
========
$context = new Context();
$context->application = new Application();
$context->logger = new Logger(...);
doFoo($context);
========
function doFoo(Context $context) {
$context->application->doStuff();
$context->logger->logThings();
}
(вы можете использовать методы получения / установки, если вам нужно защитить данные или манипулировать ими, или если вы хотите использовать ленивую инициацию и т. Д.).
Удачи!