Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

Не могу подключить namespace используя autoload

#php #namespace


Класс Autoload.php подключает в проект все имеющиеся .php-файлы. Не могу использовать
пространство имен какого-либо файла, если он подключен через Autoload. 

Ручное подключение файла (используя require/include) и подключение его namespace
работает без ошибок. 

Autoload.php:


Ответы

Ответ 1



У вас $class_name передается как полное имя класса вместе с пространством имен. И вот на этом этапе $path = ROOT . $path . $class_name . '.php'; у вас получается что-то вроде ROOT.'/models/Admin\\Auth.php' А такого файла у вас скорее всего нет

Ответ 2



можно еще так str_replace('\\', '/', __NAMESPACE__); , хотя в вашем случае нужно только короткое имя класса. Интересно что namespace обязательно должен присутствовать в файле класса, а доступ к нему производится или установкой пространства имен или указанием полного имени класса или имени класса относительно установленного пространства имен. Ниже загрузчик, код не мой, но я проверял он вполне рабочий. Нужно только загрузить сам загрузчик, выше него естественно указать желаемое пространство имен, и дальше уже работать непосредственно с классами и их функциями. Загрузчик AutoPSR-4.php test(); Z\Zed::test(); //расположен в models\Z\Zed.php \controllers\Xclass::test(); // расположен вне текущего пространства имен в controllers\Xclass.php Пример класса controllers\Xclass.php класс Xclass'; } }

Ответ 3



Автозагрузчик composer`a. Подключение через композер, предполагает запихивание всего апликейшена в папку, связывание с именем проекта, а следовательно все неймспейсы приобрели дополнительный префикс \Проект, и стал выглядеть подобным образом \Проект\сабнеймспейс\класс, т.е. нужно для нормального функционирования, переименовывать во всех файлах проекта пространство имен, внедряя имя проекта, но чтобы не менять в глубинах кода используемые классы, можно добавить указатель на пространство имен use. Теперь в начале каждого класса пишем используемое пространство имён. У основных классов это:

Комментариев нет:

Отправить комментарий