Як працює yii

1. Ініціалізація Yii :: app ()

Дивись, у файлі www / index.php такі рядки


При відпрацюванні рядки 2 виконується код


У рядку 12 з урахуванням динамічного зв'язування виконується return new CWebApplication ($ config);

Якщо пройти по батьківським класах, то можна знайти, що
class CWebApplication extends CApplication.


У рядку 7 викликається Yii :: setApplication ($ this) ;. а якщо подивитися клас Yii і його батька YiiBase. то можна побачити як в результаті инициализируется змінна для конструкції Yii :: app ()
class Yii extends YiiBase <>

Тепер зрозуміло, що при ініціалізації суті типу CWebApplication ця сутність встановилася в приватну змінну YiiBase :: $ _ app. яка доступна через виклик Yii :: app ()

Це була ініціалізація

2. Використання Yii :: app () -> module або Yii :: app () -> component

Ще раз подивися на клас CApplication


У методі configure ($ config) відбувається підготовка даних, які знадобляться пізніше для таких викликів як (наприклад) Yii :: app () -> db

Давай подивимося на клас Module, в якому і реалізується логіка таких викликів


Спробуємо розшифрувати виклик Yii :: app () -> db

Як я вже показав, Yii :: app () - це сутність типу CWebApplication. а у неї немає публічного властивості $ db. тому PHP викликає магічний метод __get () з базового класу CModule. (Подивися в документації "магічні методи")

Отже, властивості CWebApplication-> db не існує і викликається CModule -> __ get ( 'db'). далі код вважає, що, можливо здійснюється виклик компоненти.

Метод CModule-> hasComponent ( 'db') перевіряє, що раніше були задані якісь настройки зазначеної через файл конфігурації protected / config / main.php або іншим способом. Якщо так, то то викликається CModule-> getComponent ( 'db'.). який викликає Yii :: createComponent ($ config). де $ config - це знайдені настройки зазначеної компоненти, наприклад, параметри з'єднання з базою даних для компоненти db

Подивимося, що робить Yii :: createComponent ($ config)


Складні метод. Суть його в інстанціірованіі нової сутності якогось класу, 5 або 6 способів. Справа в тому, що цей метод CModule :: createComponent () може бути викликаний звідки завгодно і у нього купа варіантів передачі параметрів.

Отже, CModule :: createComponent () створив і повернув нову сутність. І на виході з методу CModule :: getComponent () отримана сутність записується в масив CModule -> _ components під ім'ям 'db'.

Усі наступні виклики Yii :: app () -> db перевірятимуть наявність інстанціінованной суті в масиві CModule -> _ components [ 'db'] і використовувати його, якщо він там знайдений

Виклик Yii :: app () -> db
А. Динамічно инициализирует компоненту, у міру необхідності
Б. Налаштовує її даними, які в частновті можна визначити через файл конфігурації protected / config / main.php
В. Ініціалізується компоненту тільки один раз за цикл роботи PHP додатки

Сподіваюся я зрозуміло виклав механізм ледачою ініціалізації компонент