Класс Application

Cущность Tygh\Application появилась в версии 4.3.2.

Объект класса Application создаётся при инициализации ядра в файле init.php, после чего он доступен отовсюду:

// получение объекта Application
Tygh::$app

На текущий момент единственное его предназначение ― IoC-контейнер, хранящий объекты и фабричные анонимные функции для создания объектов.

IoC-контейнер

Раньше хранением объектов занимался класс Registry. Сейчас его функция ― хранение кэша и других runtime-данных:

// было
$smarty = Registry::get('view');

// стало
$smarty = Tygh::$app['view'];

Контейнер, который предоставляет Application, отличается от контейнера Registry возможностью “ленивого” объявления объектов, которые должны в нём храниться. Объекты, хранящиеся в контейнере, называются сервисами. Обычно это компоненты большей системы, имеющие свою узкую зону ответственности, например: менеджер отправки писем, соединение с базой данных.

// Регистрируем объект в контейнере при помощи анонимной фабричной функции.
Tygh::$app['foo'] = function($app) {
    return new Tygh\Foo();
};

Tygh::$app['bar'] = function($app) {
    return new Tygh\Bar($app['foo']);
};

// На текущий момент ни одного объекта ещё создано не было, они будут созданы по первому требованию.

// Application вернёт результат выполнения анонимной функции-фабрики, которую мы зарегистрировали ранее.
// Причём в конструктор класса Tygh\Bar будет передан результат выполнения другой функции-фабрики.
$bar_instance = Tygh::$app['bar'];

// Строка выше эквивалентна этому коду:
$foo_instance = new Tygh\Foo();
$bar_instance = new Tygh\Bar($foo_instance);

// При повторном получении сервиса из контейнера будет возвращён тот же самый объект (новый не создаётся).
var_dump($bar_instance === Tygh::$app['bar']); // true

// Если НУЖНО чтобы при каждом обращении к сервису в контейнер возвращался НОВЫЙ объект,
// то при регистрации сервиса необходимо обернуть анонимную функцию-фабрику таким образом:
Tygh::$app['cool_service'] = Tygh::$app->factory(function($app) {
    return new Tygh\CoolService();
});

// Это всё разные объекты:
$a = Tygh::$app['cool_service'];
$b = Tygh::$app['cool_service'];
$c = Tygh::$app['cool_service'];

// Кроме вышеупомянутых способов, можно просто положить конкретный объект в контейнер ―
// это то поведение, которое предоставлял Registry.
Tygh::$app['my_object'] = new Tygh\MyClass();

Читайте подробную документацию по использованию контейнера на странице https://github.com/silexphp/Pimple.

Для обеспечения обратной совместимости Registry перенаправляет вызовы к сервисам api, crypt, view, ajax и class_loader в контейнер.

Что дальше?

В будущем Application будет реализовывать функции-инициализаторы (fn_init()) и обрабатывать текущие запросы (fn_dispatch()).