❝오랫동안 고민하다가 드디어 글을 쓰기 시작했습니다. 프로모션과 인터뷰를 다룰 수 있는 글을 연재하고 싶습니다. 이 글을 읽으시면서, 카카가 작성하지 않은 뜨거운 인터뷰 질문이나 기술적인 어려움을 발견하신 경우 댓글로 지적해 주시고 함께 개선해 주시기 바랍니다.
❞
현재 PHP 고급 로드맵을 정리하는 중입니다. 좋은 제안이 있으면 최대한 빨리 포함하겠습니다.
thinkphplibrarythinkLoader.php
有一个register的方法,在这个方法里边,我们先学习第一个知识点spl_autoload_register()
에 오셔서 과거와 현재의 삶과 spl_autoload_register의 간단한 사용법에 대해 이야기하세요 , 직접 클릭하시면 보실 수 있습니다.
다음 단계는 프로젝트의 루트 경로와 작곡가의 경로입니다.
여기서부터 작곡가 파일을 로드하는데, 과정도 매우 간단합니다
그런 다음 Vendorcomposerautoload_static.php 파일로 이동하여 이 두 가지 속성을 확인할 수 있습니다
这里有一段代码估计有一part分同文会在这里绕一下self::${$attr} = $composerClass::${$attr};
, 这里的$attr
就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'
数据,외부재재加一个$
符号。self::${$attr} = $composerClass::${$attr};
,这里的$attr
就是'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'
这些数据,外层在加一个$
符号。
从而在ComposerStaticInit30742487e00917c888d89ba216f165b9
ComposerStaticInit30742487e00917c888d89ba216f165b9
파일 또는 thinkphplibrarythinkLoader.php
'sregister
메소드 thinkphplibrarythinkLoader.php
的register
方法
在这里注册了俩个命令空间,分别为think和traits。然后会进入到addNamespace这个方法中在addNamespace
方法中,添加了Psr4空间
addNamespace 메소드, 추가됨 <code style="overflow-wrap: break-word; margin: 0px 2px;font-family: " operator mono consolas monaco menlo monospace word-break: break-all color : rgb rgba>Psr4 공간 코드>🎜<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;"><img src="https://img-blog.csdnimg.cn/2020091320281021.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다." style="max-width:90%">그런 다음 두 네임스페이스를 <code style="overflow-wrap: break-word; margin: 0px 2px;font-family: " operator mono consolas monaco menlo monospace rgb :>ComposerStaticInit1e269472f484e157e90227b420ffca7a 클래스의 $prefixLengthsPsr4 및 $prefixDirsPsr4 속성에서
ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中
为了验证上面做一个断点调试,看到这些数据就应该清晰了,至于traits
也是一样的注册方式。
截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。
psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范
此处的类是指class、接口、超类结构
一个完整的类需要一下结构()*
전체 클래스 이름에는 "공급업체 네임스페이스"라는 최상위 네임스페이스가 있어야 합니다.
전체 클래스 이름에는 하나 이상의 하위 네임스페이스가 있을 수 있습니다.
클래스 이름에는 최종 클래스 이름이 있어야 합니다. 전체 클래스 이름의 밑줄은 특별한 의미가 없습니다. 전체 클래스 이름은 어떤 경우에도 문자로 구성될 수 있습니다.
모든 클래스 이름은 대소문자를 구분해야 합니다. .
이 시점에서 분명히 질문이 있을 것입니다. 왜 여기에 classmap.php 파일이 없습니까? 서두르지 말고, 당황하지 말고 먼저 실행하세요php think optimize:autoload
把文件弄出来最终会走到addClassMap
这个方法,在这个方法中,只是把classmap.php
这个文件的数据赋值给$classMap
, 다른 사용법은 없습니다
extend 이 디렉터리는 많은 사람들이 사용하고 있습니다. TP 프레임워크를 사용한 사용자는 여기 디렉토리에 사용자 정의된 클래스 라이브러리 파일을 저장할 수 있습니다.
아래 그림에서 볼 수 있듯이 addAutoLoadDir
이 메소드는 addAutoLoadDir
这个方法进行加载的
在方法中也仅仅是把extend的路径赋值给了$fallbackDirsPsr4
这个属性。
截止到这里Loader::register();
$fallbackDirsPsr4
여기에서 끝이 부분은 끝났습니다. 내부 구현 및 실제 사례를 심층적으로 살펴보겠습니다. 🎜🎜위 읽기 소스코드에는 4가지 속성이 있는데, 간단히 정리해보자🎜<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;"><img src="https://img-blog.csdnimg.cn/20200915002436209.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다." style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; font-size: 13px;"><span style="background-image: url(https://img.alicdn.com/tfs/TB1Yycwyrj1gK0jSZFuXXcrHpXa-32-32.png); display: inline-block; width: 18px; height: 18px; background-size: 18px; background-repeat: no-repeat; background-position: center; margin-right: 5px; margin-bottom: -5px;"></span>여기에 그림 설명 삽입</figcaption></figure><h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; font-size: 25px;">
<span class="prefix" style="color: rgb(64, 184, 250); display: none;"></span><span class="content" style="display: inline-block; color: rgb(64, 184, 250);"> 2. 수업 로딩 과정에 대한 간략한 소개</span><span class="suffix" style="display: inline-block; color: rgb(64, 184, 250);"></span>
</h1>
<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;"><img src="https://img-blog.csdnimg.cn/20200915151700759.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmdrYW5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다." style="max-width:90%"><figcaption style="margin-top: 5px; text-align: center; font-size: 13px;"><span style="background-image: url(https://img.alicdn.com/tfs/TB1Yycwyrj1gK0jSZFuXXcrHpXa-32-32.png); display: inline-block; width: 18px; height: 18px; background-size: 18px; background-repeat: no-repeat; background-position: center; margin-right: 5px; margin-bottom: -5px;"></span>여기에 그림 설명 삽입</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 26px; margin-top: 10px; margin-bottom: 10px; font-size: 14px; word-spacing: 2px;">파싱을 시작했을 때 소스 코드를 보내는 중 여기에는 <code style="overflow-wrap: break-word; margin: 0px 2px;font-family: " operator mono consolas monaco menlo monospace word-break: break-all color : rgb rgba><code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>spl_autoload_register
当需要使用的类没有被引入时,这个函数会在PHP报错前被触发,未定义的类名会被当作参数传入这里会直接去执行think\Loader::autoload
think\Loader::autoload
이 방법 중단점 전달이 로드되지 않았습니다. 클래스는 thinkError🎜입니다.왜 생각해야 할까요?Error! thinkphp/base.php /code>보세요, 자동 로딩이 완료된 후 가장 먼저 실행되는 클래스는 Error<code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>thinkphp/base.php
看一下,当自动加载完执行完成后第一个执行的类就是Error
可以简单的做个测试,将这Error改为Kaka,进行打印一下,这时的类就改变为Kaka。到这里大家对这个类的自动加载机制就有一定的了解了。
当使用的类没有被引入时会把这个类当做参数传到thinkphp/library/think/Loader.php
的autoload
사용된 클래스가 도입되지 않은 경우 이 클래스는 thinkphp/library/think/Loader.php
's자동 로드
방법.
여기로 와서 자동 로드 방법을 살펴보세요
🎜🎜findFile 메서드로 시작하여 알 수 없는 클래스를 이 메서드에 전달합니다. findFile 메서드에서는 thinkError 클래스가 classMap 속성에서 직접 전송됩니다. 바로 반납됩니다🎜thinkError 클래스의 전체 경로를 autoload
의 변수 뒤에는 win 환경의 크기가 한 번 판단됩니다. <code style="overflow-wrap: break-word; margin: 0px 2px; font-family: " operator mono consolas monaco menlo monospace word-break: break-all color: rgb background: rgba padding: border-radius: height: line-height:>autoload
的file
变量后,把win环境的大小写给判断了一次。
然后直接使用include
引入文件即可,直到返回。
直到这里就是一次完整的类的自动加载解析。
虽然到这里结束了,但是还是得在提一点就是$classMap
这个属性,这个属性是基于文件classmap.php
来到,这个文件的生成也是需要执行命令php think optimize:autoload
生成的。
当没有生成这个文件时程序是如何执行的呢!
之前的所有流程都是一样的,只有在findFile
포함
파일이 반환될 때까지 파일을 가져오기만 하면 됩니다. 지금까지 수업에 대한 완전한 자동 로딩 분석이 이루어졌습니다. 🎜🎜여기서 끝나지만 한 가지 언급해야 할 점이 있습니다: $classMap
이 속성은 classmap.php
는 여기에 있습니다. 이 파일을 생성하려면 php 생각 최적화:자동 로드
생성되었습니다. 🎜🎜이 파일이 생성되지 않은 경우 프로그램은 어떻게 실행됩니까? 🎜🎜이전 프로세스는 모두 동일하며 findFile
이건 다른데 간단히 정리해보자. 🎜🎜현재로서는 코드가 classMap을 따르지 않습니다🎜먼저 thinkError 파일을 구합니다
그런 다음 Composer의 자동 로딩에서 두 속성을 통해 네임스페이스를 구하고 thinkError.php 파일을 splice합니다
반환된 최종 결과도 D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php
이 파일입니다.
여기 코드를 주의 깊게 읽어야 합니다.
여기서는 수업 자동 로딩이 완전히 끝났습니다.
먼저 kaka 폴더를 만듭니다.
그런 다음 Kaka.php
파일을 컨트롤러 인덱스에 삽입하여 직접 액세스합니다. 클래스는 분명 오류를 보고할 텐데, 직접 접근할 수 있도록 어떻게 조작해야 할까요!
이때 소스코드의 중요성이 드러납니다. 등록
함수, 확장 디렉터리가 로드됩니다register
函数中,加载过extend目录
这时在加一个kaka这个目录,直接进行访问一下
没毛病,直接就出来了。一切OK在这里在聊一下关于extent的加载方式
在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了$fallbackDirsPsr4
$fallbackDirsPsr4
속성에 대해서는 자세히 설명하지 않겠습니다. . 🎜🎜소스코드 읽기는 구현 후 확인을 통해서만 가능합니다🎜정의된 클래스만 입력하면 자동 로딩을 위한 자동 로딩으로 넘어갑니다
findFile
이 방법findFile
这个方法
在findFile这个方法中可以看到这段代码,这个属性是不是很熟悉,就是自动加载extend目录时添加到$fallbackDirsPsr4
属性的。
当在findFile中打印参数class时看一下数据
很清楚地可以看到testKaka
속성. 🎜🎜<img src="https://img-blog.csdnimg.cn/20200915181956262.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Zhbmdr%20Y%20W5nNw==,size_16,color_FFFFFF,t_70#pic_center" alt="여기에 이미지 설명 삽입" style="max-width:90%">findFile에서 매개변수 클래스를 인쇄할 때 데이터를 살펴보세요🎜🎜<code style="overflow-wrap: break-word; margin: 0px 2px;font-family: " operator mono consolas rgb height : line-height:>testKaka
이 클래스🎜이제 이것을 인쇄하세요 속성 zZG4ubmV0L2ZhbmdrYW5nNw== ,size_16,color_FFFFFF,t_70#pic_center" alt="여기에 이미지 설명 삽입" style="max-width: 100%; border-radius: 6px; auto; object-fit: contain; box -shadow: 2px 4px 7px #999;"/>그런 다음 <code style="overflow-wrap: break-word margin: 0px 2px; Consolas, Monaco, Menlo, monospace; 단어 나누기: break-all; 색상: rgb(59, 170, 250, 0.1); 테두리 반경: 2px ; height: 21px; line-height : 22px;">__include_file
을 직접 포함하려면D:phpstudy_proWWWWThinkPHPSourceCodeAnalytickakatestKaka.php
우리가 정의한 파일입니다. $fallbackDirsPsr4
属性里边返回的file
然后就是使用__include_file
来直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.php
我们定义的文件。
以上的这个自定义文件如何实现类的自动加载,并且也就是extend
extend
로딩 방법 ❝배움에 대한 끈기, 블로그에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 늘 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요❞
위 내용은 ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!