Классы в 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';
В противном случае, вам нужно будет включать исходники вручную.