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