Поиск сообщества
Показаны результаты для тегов 'autoloading'.
Найдено: 1 результат
-
Классы в 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'; В противном случае, вам нужно будет включать исходники вручную.