Теперь вы должны понимать, что загрузчик ThinkPHP загружается автоматически.

PHP

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

предисловие

В настоящее время разрабатывается расширенная дорожная карта PHP, и если будут хорошие предложения, Kaka будет включен в первый раз.

1. Анализ исходного кода загрузчика автоматической загрузки

1-1 Цели обучения

  • автозагрузка классов
  • Два способа автозагрузки классов
  • Необходимо использовать spl_autoload_register
  • Автозагрузка классов, реализующих пользовательские файлы

1-2 Композитор загружен

在这里插入图片描述
вставьте сюда описание изображения

Из диаграммы анализа, приведенной Кака выше, класс загрузчика сначала загружается в base.php, а затем вызывается метод регистрации.

在这里插入图片描述приходитьthinkphp\library\think\Loader.phpСуществует метод регистрации, в этом методе мы сначала узнаем первую точку знанияspl_autoload_register()Поговорите с SPL_AUTOLOAD_REGISTER перед ними и просто используйте, щелкните для просмотра.

Далее идет корневой путь проекта и путь композитора.

在这里插入图片描述
вставьте сюда описание изображения

Отсюда загружается файл композитора, и процесс также очень прост

  • 1. Определите, является ли композитор каталогом
  • 2. Определите, является ли autoload_static.php по пути файлом
  • 3. Представьте файл AutoloD_Static.php
  • 4. Возвращает все объявленные классы Возврат массива
  • 5. Получить последний класс ComposerStaticInit30742487e00917c888d89ba216f165b9
  • 6. Определить есть ли данные в массиве ComposerStaticInit30742487e00917c888d89ba216f165b9

在这里插入图片描述Затем вы можете увидеть эти два свойства в файле vendor\composer\autoload_static.php.

在这里插入图片描述Вот кусок кода, предполагается, что здесь будут ходить некоторые студентыself::${$attr} = $composerClass::${$attr};,здесь$attrэто'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'Эти данные, внешний слой добавляет$символ.

таким образом вComposerStaticInit30742487e00917c888d89ba216f165b9Этот класс напрямую получает соответствующие значения атрибута, то есть два значения атрибута на рисунке выше.

在这里插入图片描述
вставьте сюда описание изображения

Пространство имен регистрации 1-3

файл ещеthinkphp\library\think\Loader.phpизregisterметод

Здесь зарегистрированы два пространства имен, think и traits. Затем он войдет в метод addNamespace在这里插入图片描述существуетaddNamespaceметод, добавленныйPsr4空间

在这里插入图片描述Затем перейдите к методу addPsr4, который зарегистрирует оба пространства имен вComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中

在这里插入图片描述Чтобы убедиться, что вышеуказанная точка останова отлажена, убедитесь, что эти данные должны быть четкими, как дляtraitsТочно так же и зарегистрироваться.

На данный момент регистрация пространства имен завершена, теперь давайте изучим, что такое пространство имен psr4.在这里插入图片描述

1-4 Что такое Psr4

psr — это простое понимание пути к файлу, соответствующие спецификации для автоматической загрузки соответствующего класса, а текущий TP5.1 использует спецификацию psr4.

Класс здесь относится к классу, интерфейсу, структуре суперкласса.

Для полного класса требуется следующая структура\<命名空间>(\<子命名空间>)*\<类名>

Следующий документ спецификации от PHP

  • Полное имя класса должно иметь пространство имен верхнего уровня, называемое «пространство имен поставщика»;

  • Полное имя класса может иметь одно или несколько подпространств имен;

  • Полное имя класса должно иметь окончательное имя класса;

  • Знак подчеркивания в любой части полного имени класса не имеет особого значения;

  • Полное имя класса может состоять из любого регистра;

  • Все имена классов должны быть чувствительны к регистру.

Ниже приведен пример, предоставленный официальным лицом.Если вы можете понять эту спецификацию psr, постарайтесь понять ее как можно лучше.在这里插入图片描述

1-5 Загрузите файл сопоставления библиотеки классов

В этот момент должен возникнуть вопрос, почему здесь нет файла classmap.php.在这里插入图片描述Не паникуйте, сделайте это первымphp think optimize:autoloadполучить файл在这里插入图片描述в конце концов пойдетaddClassMapЭтот метод, в этом методе, просто поместитеclassmap.phpДанные этого файла назначаются$classMapВот и все, больше ничего在这里插入图片描述

1-6 Автоматически загружать каталог расширения

Каталог расширения использовался многими людьми, которые использовали инфраструктуру TP.В этом каталоге вы можете хранить файлы пользовательских библиотек классов.

На рисунке ниже видно, что использованиеaddAutoLoadDirзагружается этим методом

在这里插入图片描述В методе назначается только путь расширения$fallbackDirsPsr4это свойство.

在这里插入图片描述до сюдаLoader::register();Эта часть завершена, а затем мы углубимся в внутреннюю реализацию и практические кейсы.

В приведенном выше исходном коде для чтения есть четыре атрибута, просто отсортируйте их.

在这里插入图片描述
вставьте сюда описание изображения

2. Кратко опишите процесс загрузки класса

在这里插入图片描述
вставьте сюда описание изображения

Здесь есть функция, когда вы просто начинаете парсить исходный кодspl_autoload_register

Когда используемый класс не был введен, эта функция будет запущена до того, как PHP сообщит об ошибке, а неопределенное имя класса будет передано в качестве параметра и выполнено напрямую.think\\Loader::autoloadСюда

在这里插入图片描述Первый класс, не загруженный после точки останова, это think\Error

在这里插入图片描述Зачем думать\Ошибка! можно вернуться кthinkphp/base.phpВзгляните, первый класс, который будет выполняться после завершения автозагрузки, это Error

在这里插入图片描述Вы можете просто сделать тест, изменить Error на Kaka, распечатать его, и тогда класс изменится на Kaka. На данный момент у каждого есть определенное представление о механизме автозагрузки этого класса.

Если используемый класс не импортирован, он будет передан в качестве параметра вthinkphp/library/think/Loader.phpизautoloadметод.

在这里插入图片描述Перейдите сюда, чтобы взглянуть на метод автозагрузки

在这里插入图片描述Начнем с метода findFile и передадим несвязанный класс в этот метод.В методе findFile файл, отображенный классом think\Error, будет возвращен непосредственно из атрибута classMap.

在这里插入图片描述Верните полный путь к классу think\Error вautoloadизfileПосле переменной случай выигрышной среды оценивается один раз.

затем используйте напрямуюincludeПросто импортируйте файл, пока не вернетесь.

Пока вот полный разбор автозагрузки класса.

在这里插入图片描述Хотя это здесь, я все еще должен упомянуть, что$classMapЭто свойство, это свойство основано на файлеclassmap.phpДа ладно, для генерации этого файла тоже нужно выполнить командуphp think optimize:autoloadСгенерировано.

Как работает программа, если этот файл не генерируется!

Все предыдущие процессы такие же, только еслиfindFileЗдесь все иначе, поэтому давайте вкратце разберемся.

В это время код точно не попадет в classMap

在这里插入图片描述Сначала получите файл think\Error

在这里插入图片描述Затем получите пространство имен с помощью двух свойств автоматической загрузки Composer и соединения файла think\Error.php.

在这里插入图片描述Окончательный возвращаемый результат такжеD:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\thinkphp\library\think\Error.phpэтот файл.

Код здесь нуждается в хорошем прочтении.

На этом автозагрузка классов заканчивается.

3. Как реализовать автоматическую загрузку классов в пользовательских файлах

Сначала создайте папку кака

在这里插入图片描述На данный момент файл Kaka.php внесен в индекс контроллера.

在这里插入图片描述Прямой доступ, то этот класс обязательно сообщит об ошибке, так что же нам делать, чтобы получить к нему прямой доступ!

在这里插入图片描述
вставьте сюда описание изображения

В это время упоминается важность исходного кода, и я до сих пор помню, что в автозагрузкеregisterВ функции загружается каталог расширения

在这里插入图片描述
вставьте сюда описание изображения

В это время добавьте каталог kaka и получите к нему прямой доступ.

在这里插入图片描述Ничего страшного, только что вышел. все ок在这里插入图片描述Давайте поговорим о методе загрузки экстента здесь

Говоря о регистрации каталога библиотеки классов с автозагрузкой, прежде чем просто объяснили, что он просто сохранил путь к$fallbackDirsPsr4Атрибуты, не детализированные, следующий должен объяснить их.

Чтение исходного кода можно только реализовать, а затем просмотреть

在这里插入图片描述
вставьте сюда описание изображения

Пока определенный класс перейдет в автозагрузку для автоматической загрузки

также войдетfindFileСюда

在这里插入图片描述Этот код можно увидеть в методе findFile. Вам знакомо это свойство? Оно добавляется в каталог расширения при автоматической загрузке.$fallbackDirsPsr4атрибут.

在这里插入图片描述Взгляните на данные при печати класса параметров в findFile.

ясно видноtest\Kakaэтот класс

在这里插入图片描述 在这里插入图片描述Теперь распечатайте это$fallbackDirsPsr4Файл, возвращаемый в атрибуте

在这里插入图片描述Тогда просто используйте__include_fileвключать непосредственноD:\phpstudy_pro\WWW\ThinkPHPSourceCodeAnalysis\kaka\test\Kaka.phpфайл, который мы определяем.

Как приведенный выше пользовательский файл реализует автоматическую загрузку классов, и этоextendспособ загрузки

4. Резюме

Весь процесс автоматической загрузки классов завершен, если есть какие-то ошибки, вы можете оставлять их в комментариях!

Настойчивость в обучении, ведении блога и обмене информацией — вот убеждения, которых Кака всегда придерживалась с самого начала своей карьеры. Я надеюсь, что статьи в огромном Интернете могут немного помочь вам. Я Кака, увидимся в следующий раз.