❝После долгих размышлений об этом и, наконец, начала писать серию статей, я надеюсь написать серию статей, которые могут быть обработаны продвижением и интервью. Когда вы читаете эту статью, если вы обнаружите горячие вопросы интервью или технические трудности, о которых Кака не написал, пожалуйста, с нетерпением ждите области комментариев, чтобы указать и улучшить вместе.
❞
предисловие
В настоящее время разрабатывается расширенная дорожная карта 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. Резюме
Весь процесс автоматической загрузки классов завершен, если есть какие-то ошибки, вы можете оставлять их в комментариях!
❝Настойчивость в обучении, ведении блога и обмене информацией — вот убеждения, которых Кака всегда придерживалась с самого начала своей карьеры. Я надеюсь, что статьи в огромном Интернете могут немного помочь вам. Я Кака, увидимся в следующий раз.
❞