Узнал из видео что в модуле из папки lib файлы подключаются автоматически при соблюдении условий: 1. Один файл, один класс 2. Имя файла = Ммя класса без расширения
Код
// lib/integration.php
class integration
{
public static function Init()
{
echo 'test';
}
}
Сделал как сказано на видео, но класс не подключился. Подключил принудительно в файле include.php с помощью registerAutoLoadClasses и все заработало.
W W, я как раз и не хочу заморачиваться, я хочу понять как это должно работать, если это вообще работает. А для принудительного подключения классов registerAutoLoadClasses более чем достаточно, зачем свой писать?
Ничего не могу сказать по поводу автозагрузки из папки lib, в стандартных модулях вроде тупо пути прописаны к КАЖДОМУ файлу, как и ваш registerAutoLoadClasses тоже требует полного указания пути, что на мой взгляд очень неудобно.
Я предлагаю свой автолодер потому как это удобно, вам нужно лишь указать папку где лежит базовая папка для базового пространства, больше ничего прописывать не нужно. include.php можно сделать в 2 строчки =)
Сильно не вникал но беглый осмотр registerAutoLoadClasses говорит о том что все подключается сразу, смысл вообще этой функции тогда не ясен. Возможно я не прав, поправьте.
W W написал: А где вы нашли информацию о том что из этой папке что-то должно само подключаться?
В самом первом сообщении ссылка на видео есть. Там как раз и рассказывается про условия, которые надо соблюдать что бы классы автоматически подключались.
Алексей Сумин, заметил что для корректной работы встроенного автозагрузчика нужно чтобы иерархия каталогов внутри lib совпадала с иерархией namespace'ов.
Вот так у меня все работает:
--- lib --- --- sample.php (namespace Vendor\Module; class Sample) --- --- example.php (namespace Vendor\Module; class Example) --- --- logic --- --- --- sample.php (namespace Vendor\Module\Logic; class Sample) --- --- --- example.php (namespace Vendor\Module\Logic; class Example)
Потом просто в любом месте пишем:
Код
Loader::includeModule('your_module');
use Vendor\Module;
Module\Sample::test();
Module\Example::test();
use Vendor\Module\Logic;
Logic\Sample::test();
Logic\Example::test();
И все работает.
А если расположение файла в папке lib не соответствует иерархии в пространстве имен, то только ручками в include.php
Вопрос в чем, я оставил include.php пустым, на сколько я понял из папки lib должен автозагрузчик битрикса срабатывать, или нужно что-то прописывать дополнительно?
Прежде всего нельзя называть модули "bitrix.*" это имя уже занято, хоть и явно в названии модуля не прописывается. Представим , что модуль называется не "bitrix.test", а "partner.test".
1. названия файлов в нижнем регистре должны быть. Т.е. testclass.php 2. пространство имен у вас не правильное. \Vendor\Module\ - это просто пример был. Верхний уровень - название партнера, второй - название модуля (С заглавной буквы). Должно быть так в конкретном случае:
Обрадовали, сейчас занимаюсь модулем и у меня как раз с bitrix начинается =) нужно исправить и как-то не подумалось что точки могут означать пространство имен для классов, это битрикс.
Код
1. названия файлов в нижнем регистре должны быть. Т.е. testclass.php
Работает и по нормальному с TestClass.php
Ключевой момент тут в названии папки модуля (id модуля), в данном случае если id модуля "partner.test" то базовое пространство имен должно быть "\Partner\Test".
Код
<?
//\bitrix\modules\partner.test\lib\TestClass.php
namespace Partner\Test;
class TestClass
{
public static function helloWorld()
{
echo __METHOD__;
}
}
Не правда, тестировал на сервере с CentOS 6.5, долго открывать локальный проект, когда уже удаленный в работе =) Версия 1С-Битрикс: Управление сайтом 16.0.13 - у меня работает.
Автозагрузчик битрикса все имена и пространства имен приводит к нижнему регистру, поэтому все файлы и папки (в lib) должны именоваться в нижнем регистре. Поэтому да только для win, скорее всего на opcache попал. Соррь.
Еще один важный момент для модулей с id например partner.test.testnamespace автозагрузчик работает некорректно, папка модуля и имя в этом случае определяется неправильно:
И все таки вы правы, извиняюсь. Это конечно странно, вот у меня работало, возможно на opcache попал, извиняюсь.
Автозагрузчик битрикса все имена и пространства имен приводит к нижнему регистру, поэтому все файлы и папки (в lib) должны именоваться в нижнем регистре.
В папке на сервере оказалось два файла один testclass.php другой TestClass.php, поэтому наврал.