Jump to content

Автозагрузка классов

Классы в Invision Community 4 являются "автоматически подгружаемыми". Это означает, что вам не нужно подключать исходный файл IPS4.

Для справки, метод автоподгрузки \IPS\IPS::autoloader() находится в файле init.php корневого каталога.

Местонахождение классов

Классы должны быть расположены в правильной дериктории и быть корректно названы, чтобы загрузчик мог найти их.

Существует всего три дериктории:

  • Классы фреймворка
    Структура имени класса: \IPS\Namespace\Class.
    Расположение на диске: system/Namespace/Class.php.

  • Классы приложений
    Структура имени класса: \IPS\app\Namespace\Class (обратите внимание, что ключ приложения в нижнем регистре, но части после используют PascalCase).
    Расположение на диске: applications/app/sources/Namespace/Class.php 

  • Расширения приложений и модули
    Структура имени класса : \IPS\app\modules\front\module\controller (обратите внимание, все части в нижнем регистре)
    Расположение на диске: applications/app/modules/front/module/controller.php

Для классов фреймворка и классов приложений, конечный файл всегда должен находиться в пределах папки (не беспорядочно в системном каталоге). Если он будет находится хотя бы на один уровень глубже, система будет искать файл в каталоге с тем же именем. Например \IPS\Member находится в директории system/Member/Member.php в то время как \IPS\Member\Group находится в system/Member/Group.php

Подмена кода (Monkey Patching)

При обьявлении, классы всегда начинаются с подчеркивания. Например, в Invision Community вы вызываете так:   \IPS\Member, однако, если посмотреть в исходном файле вы увидите, что он объявлен следующим образом:

namespace IPS;
class _Member { ...

Этот прием называется “Обезьяним патчем” (Monkey Patching), который позволяет сторонним разработчикам перегрузить любой класс без какого-либо пересмотра кода и не конфликтовать хукам друг с другом.

В этом примере система, сразу после автозагрузки файла Member.php, выполнит такой код:

namespace IPS;
class Member extends \IPS\_Member { }

Если сторонний разработчик хочет перегрузить \IPS\Member, система вставит это внутрь, так что в итоге получится примерно так:

\IPS\Member extends hook1
hook1 extends \IPS\_Member 

Или, если два хука хотят перегрузить \IPS\Member:

\IPS\Member extends hook1
hook1 extends hook2
hook2 extends \IPS\_Member

Это означает, что фреймворк, или любой сторонний код должен только вызвать \IPS\Member, и система не только автоматически подгрузит источник, но и создаст цепочку любых хуков, которые хотят перегрузить класс.

Если эта технология выглядит пугающе (это не обычная практика) - вы не обязаны это понимать. Вам нужно только знать, что классы должны начинаться с подчеркивания при объявлении, но это подчеркивание обычно никогда не используется.

Это также означает, что вместо того, чтобы вызвать "self::"  внутри класса, вы должны вызвать "static::", так что вы обращаетесь к перегруженному классу, а не к оригинальному.

Сторонние библиотеки

Если вы хотите использовать сторонние PHP библиотеки, они, конечно, должны быть включены вручную и не могут использовать замену кода (Monkey patching).

Если библиотека соответствует стандарту нэйминга PSR-0, вы можете добавить её в \IPS\IPS::$PSR0Namespaces таким образом, и автозагрузчик затем подгрузит ее:

\IPS\IPS::$PSR0Namespaces['Libary'] = \IPS\ROOT_PATH . '/applications/app/system/3rd_party/Library';

В противном случае, вам нужно будет включать исходники вручную.




Messenger

    ×
    ×
    • Create New...

    Important Information

    By using our site you agree to our Privacy Policy