>  기사  >  PHP 프레임워크  >  ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.

ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.

咔咔
咔咔원래의
2020-09-16 10:22:172478검색

오랫동안 고민하다가 드디어 글을 쓰기 시작했습니다. 프로모션과 인터뷰를 다룰 수 있는 글을 연재하고 싶습니다. 이 글을 읽으시면서, 카카가 작성하지 않은 뜨거운 인터뷰 질문이나 기술적인 어려움을 발견하신 경우 댓글로 지적해 주시고 함께 개선해 주시기 바랍니다.

머리말

현재 PHP 고급 로드맵을 정리하는 중입니다. 좋은 제안이 있으면 최대한 빨리 포함하겠습니다.

1. 로더 소스 코드 분석 자동 로딩

1-1 학습 목표

  • 클래스를 자동으로 로딩하는 두 가지 방법
  • spl_autoload_register가 가능해야 합니다.
  • 을 사용하여 사용자 정의 파일 클래스의 자동 로딩 구현

1-2 Composer 로딩

ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.
여기에 이미지 설명 삽입
사진에서 클릭 위 분석에서 Ka가 제공한 다이어그램에서 로더 클래스는 먼저 base.php에 로드된 다음 등록 메소드가 호출됩니다.

ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다. thinkphplibrarythinkLoader.php有一个register的方法,在这个方法里边,我们先学习第一个知识点spl_autoload_register()에 오셔서 과거와 현재의 삶과 spl_autoload_register의 간단한 사용법에 대해 이야기하세요 , 직접 클릭하시면 보실 수 있습니다.

다음 단계는 프로젝트의 루트 경로와 작곡가의 경로입니다.

ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.
여기에 그림 설명을 삽입하세요

여기서부터 작곡가 파일을 로드하는데, 과정도 매우 간단합니다

  • 1. 작곡가가 디렉터리인지 확인합니다
  • 2. path.php가 파일인지 여부
  • 3. autoload_static.php 파일을 소개합니다
  • 4. 선언된 모든 클래스 배열을 반환합니다. return
  • 5. b9
  • 6. ComposerStaticInit30742487e00917c888d89ba216f165b9를 결정합니다. 배열에 데이터가 있는지 여부

ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.그런 다음 Vendorcomposerautoload_static.php 파일로 이동하여 이 두 가지 속성을 확인할 수 있습니다

ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.这里有一段代码估计有一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
ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.
여기에 이미지 설명 삽입

1-3 네임스페이스

파일 또는 thinkphplibrarythinkLoader.php'sregister 메소드 thinkphplibrarythinkLoader.phpregister方法

在这里注册了俩个命令空间,分别为think和traits。然后会进入到addNamespace这个方法中ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.addNamespace方法中,添加了Psr4空间

여기에 두 개의 명령 공간, 즉 think와 traits를 등록합니다. 그런 다음 addNamespace 메소드 여기에 이미지 설명 삽입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这俩个属性中

ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.为了验证上面做一个断点调试,看到这些数据就应该清晰了,至于traits也是一样的注册方式。

截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.

1-4 Psr4是什么玩意

psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范

此处的类是指class、接口、超类结构

一个完整的类需要一下结构()*

여기에 이미지 설명 삽입위 내용을 확인하기 위해 중단점 디버깅을 수행합니다. 이러한 데이터를 보면 명확해야 합니다. 특성도 같은 방식으로 등록됩니다.

여기까지 네임스페이스 등록이 완료되었습니다. 다음으로는 psr4 네임스페이스가 무엇인지 알아보겠습니다. 🎜

1-4 Psr4란 무엇입니까?

🎜psr은 간단합니다. 파일 경로이며, 해당 클래스의 관련 사양을 자동으로 로드합니다. 현재 TP5.1은 psr4 사양을 사용합니다🎜🎜여기서 클래스는 클래스, 인터페이스, 슈퍼 클래스 구조를 나타냅니다.🎜🎜전체 클래스에는 다음 구조가 필요합니다)* 🎜🎜다음 사양은 PHP 문서에서 가져온 것입니다🎜
  • 전체 클래스 이름에는 "공급업체 네임스페이스"라는 최상위 네임스페이스가 있어야 합니다.

  • 전체 클래스 이름에는 하나 이상의 하위 네임스페이스가 있을 수 있습니다.

  • 클래스 이름에는 최종 클래스 이름이 있어야 합니다. 전체 클래스 이름의 밑줄은 특별한 의미가 없습니다. 전체 클래스 이름은 어떤 경우에도 문자로 구성될 수 있습니다.

  • 모든 클래스 이름은 대소문자를 구분해야 합니다. .

  • 다음은 공식적인 예입니다. 이 psr 사양을 이해할 수 있다면 이해해 보세요

    1-5 클래스 라이브러리 매핑 파일 로드

    이 시점에서 분명히 질문이 있을 것입니다. 왜 여기에 classmap.php 파일이 없습니까? ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.서두르지 말고, 당황하지 말고 먼저 실행하세요php think optimize:autoload把文件弄出来ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.最终会走到addClassMap这个方法,在这个方法中,只是把classmap.php这个文件的数据赋值给$classMap, 다른 사용법은 없습니다ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.

    1-6 확장 디렉터리 자동 로드

    extend 이 디렉터리는 많은 사람들이 사용하고 있습니다. TP 프레임워크를 사용한 사용자는 여기 디렉토리에 사용자 정의된 클래스 라이브러리 파일을 저장할 수 있습니다.

    아래 그림에서 볼 수 있듯이 addAutoLoadDir 이 메소드는 addAutoLoadDir这个方法进行加载的

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.在方法中也仅仅是把extend的路径赋值给了$fallbackDirsPsr4这个属性。

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.截止到这里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

    사용할 클래스가 도입되지 않은 경우, PHP가 오류를 보고하기 전에 이 함수가 트리거됩니다. 정의되지 않은 클래스 이름이 매개변수로 전달되어 직접 실행됩니다.think\Loader::autoload이 방법

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.

    중단점 전달이 로드되지 않았습니다. 클래스는 thinkError🎜입니다.

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.왜 생각해야 할까요?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

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.可以简单的做个测试,将这Error改为Kaka,进行打印一下,这时的类就改变为Kaka。到这里大家对这个类的自动加载机制就有一定的了解了。

    当使用的类没有被引入时会把这个类当做参数传到thinkphp/library/think/Loader.phpautoload

    여기에 이미지 설명 삽입간단히 테스트를 수행하고 Error를 Kaka로 변경하고 인쇄하면 클래스가 Kaka로 변경됩니다. 이 시점에서 모든 사람은 이 클래스의 자동 로딩 메커니즘을 어느 정도 이해하고 있습니다.

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.사용된 클래스가 도입되지 않은 경우 이 클래스는 thinkphp/library/think/Loader.php's자동 로드 방법.

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.여기로 와서 자동 로드 방법을 살펴보세요

    🎜🎜findFile 메서드로 시작하여 알 수 없는 클래스를 이 메서드에 전달합니다. findFile 메서드에서는 thinkError 클래스가 classMap 속성에서 직접 전송됩니다. 바로 반납됩니다🎜

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.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:>autoloadfile变量后,把win环境的大小写给判断了一次。

    然后直接使用include引入文件即可,直到返回。

    直到这里就是一次完整的类的自动加载解析。

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.虽然到这里结束了,但是还是得在提一点就是$classMap这个属性,这个属性是基于文件classmap.php来到,这个文件的生成也是需要执行命令php think optimize:autoload生成的。

    当没有生成这个文件时程序是如何执行的呢!

    之前的所有流程都是一样的,只有在findFile

    그런 다음 포함 파일이 반환될 때까지 파일을 가져오기만 하면 됩니다.

    지금까지 수업에 대한 완전한 자동 로딩 분석이 이루어졌습니다. 🎜🎜여기에 이미지 설명 삽입여기서 끝나지만 한 가지 언급해야 할 점이 있습니다: $classMap이 속성은 classmap.php는 여기에 있습니다. 이 파일을 생성하려면 php 생각 최적화:자동 로드생성되었습니다. 🎜🎜이 파일이 생성되지 않은 경우 프로그램은 어떻게 실행됩니까? 🎜🎜이전 프로세스는 모두 동일하며 findFile이건 다른데 간단히 정리해보자. 🎜🎜현재로서는 코드가 classMap을 따르지 않습니다🎜

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.먼저 thinkError 파일을 구합니다

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.그런 다음 Composer의 자동 로딩에서 두 속성을 통해 네임스페이스를 구하고 thinkError.php 파일을 splice합니다

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.반환된 최종 결과도 D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php이 파일입니다.

    여기 코드를 주의 깊게 읽어야 합니다.

    여기서는 수업 자동 로딩이 완전히 끝났습니다.

    3. 사용자 정의 파일을 사용하여 클래스 자동 로드를 구현하는 방법

    먼저 kaka 폴더를 만듭니다.

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다. 그런 다음 Kaka.php

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다. 파일을 컨트롤러 인덱스에 삽입하여 직접 액세스합니다. 클래스는 분명 오류를 보고할 텐데, 직접 접근할 수 있도록 어떻게 조작해야 할까요!

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.
    여기에 이미지 설명 삽입

    이때 소스코드의 중요성이 드러납니다. 등록 함수, 확장 디렉터리가 로드됩니다register函数中,加载过extend目录

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.
    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.

    这时在加一个kaka这个目录,直接进行访问一下

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.没毛病,直接就出来了。一切OKThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.在这里在聊一下关于extent的加载方式

    在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了$fallbackDirsPsr4

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.

    🎜여기에 이미지 설명을 삽입하세요🎜🎜🎜카카 디렉토리를 추가하겠습니다. 직접 방문해보세요🎜🎜여기에 이미지 설명 삽입문제 없습니다. 바로 나왔습니다. 모든 것이 정상입니다여기서는 Extent의 로딩 방법에 대해 이야기해보겠습니다🎜🎜앞서 자동 로딩 클래스 라이브러리 디렉터리 등록에 대해 이야기할 때, 단지 경로를 $fallbackDirsPsr4 속성에 대해서는 자세히 설명하지 않겠습니다. . 🎜🎜소스코드 읽기는 구현 후 확인을 통해서만 가능합니다🎜
    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.
    여기에 이미지 설명 삽입

    정의된 클래스만 입력하면 자동 로딩을 위한 자동 로딩으로 넘어갑니다

    findFile이 방법findFile这个方法

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.在findFile这个方法中可以看到这段代码,这个属性是不是很熟悉,就是自动加载extend目录时添加到$fallbackDirsPsr4属性的。

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.当在findFile中打印参数class时看一下数据

    很清楚地可以看到testKaka

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.findFile 메소드에서 이 코드를 볼 수 있습니다. 이 속성이 매우 익숙합니까? 자동으로 로드할 때 속성. 🎜🎜<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이 클래스🎜

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.이제 이것을 인쇄하세요 속성 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

    ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.然后就是使用__include_file来直接includeD:phpstudy_proWWWThinkPHPSourceCodeAnalysiskakatestKaka.php我们定义的文件。

    以上的这个自定义文件如何实现类的自动加载,并且也就是extend

    위 사용자 정의 파일은 클래스 자동 로딩을 어떻게 구현합니까? 이는extend 로딩 방법

    4. 요약

    자동 클래스 로딩 과정이 모두 완료되었습니다. 오류가 있으면 댓글로 남겨주세요. 영역 !

    배움에 대한 끈기, 블로그에 대한 끈기, 공유에 대한 끈기는 카카가 경력 이후부터 늘 지켜온 신념입니다. 거대한 인터넷에 올라온 카카의 글이 여러분에게 조금이나마 도움이 되기를 바랍니다. 카카 다음호에서 만나요
    🎜

위 내용은 ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.