여기에 두 개의 명령 공간, 즉 think와 traits를 등록합니다. 그런 다음 addNamespace 메소드
addNamespace 메소드, 추가됨 Psr4 공간 코드>
그런 다음 두 네임스페이스를 ComposerStaticInit1e269472f484e157e90227b420ffca7a 클래스의 $prefixLengthsPsr4 및 $prefixDirsPsr4 속성에서ComposerStaticInit1e269472f484e157e90227b420ffca7a类的$prefixLengthsPsr4和$prefixDirsPsr4这俩个属性中
为了验证上面做一个断点调试,看到这些数据就应该清晰了,至于traits也是一样的注册方式。
截止到这里命名空间就注册完成了,接下来研究一下psr4命名空间是个什么东东。
1-4 Psr4是什么玩意
psr是简单的理解就是文件路径、自动加载对应类的相关规范、目前TP5.1使用的是psr4规范
此处的类是指class、接口、超类结构
一个完整的类需要一下结构()*
위 내용을 확인하기 위해 중단점 디버깅을 수행합니다. 이러한 데이터를 보면 명확해야 합니다. 특성도 같은 방식으로 등록됩니다.
여기까지 네임스페이스 등록이 완료되었습니다. 다음으로는 psr4 네임스페이스가 무엇인지 알아보겠습니다.
1-4 Psr4란 무엇입니까?
psr은 간단합니다. 파일 경로이며, 해당 클래스의 관련 사양을 자동으로 로드합니다. 현재 TP5.1은 psr4 사양을 사용합니다여기서 클래스는 클래스, 인터페이스, 슈퍼 클래스 구조를 나타냅니다.전체 클래스에는 다음 구조가 필요합니다)*다음 사양은 PHP 문서에서 가져온 것입니다
전체 클래스 이름에는 "공급업체 네임스페이스"라는 최상위 네임스페이스가 있어야 합니다.
전체 클래스 이름에는 하나 이상의 하위 네임스페이스가 있을 수 있습니다.
클래스 이름에는 최종 클래스 이름이 있어야 합니다. 전체 클래스 이름의 밑줄은 특별한 의미가 없습니다. 전체 클래스 이름은 어떤 경우에도 문자로 구성될 수 있습니다.
모든 클래스 이름은 대소문자를 구분해야 합니다. .
다음은 공식적인 예입니다. 이 psr 사양을 이해할 수 있다면 이해해 보세요
1-5 클래스 라이브러리 매핑 파일 로드
이 시점에서 분명히 질문이 있을 것입니다. 왜 여기에 classmap.php 파일이 없습니까?서두르지 말고, 당황하지 말고 먼저 실행하세요php think optimize:autoload把文件弄出来最终会走到addClassMap这个方法,在这个方法中,只是把classmap.php这个文件的数据赋值给$classMap, 다른 사용법은 없습니다
1-6 확장 디렉터리 자동 로드
extend 이 디렉터리는 많은 사람들이 사용하고 있습니다. TP 프레임워크를 사용한 사용자는 여기 디렉토리에 사용자 정의된 클래스 라이브러리 파일을 저장할 수 있습니다.
아래 그림에서 볼 수 있듯이addAutoLoadDir이 메소드는addAutoLoadDir这个方法进行加载的
在方法中也仅仅是把extend的路径赋值给了$fallbackDirsPsr4这个属性。
截止到这里Loader::register();
이 메소드에서는 확장 경로가
$fallbackDirsPsr4여기에서 끝
이 부분은 끝났습니다. 내부 구현 및 실제 사례를 심층적으로 살펴보겠습니다. 위 읽기 소스코드에는 4가지 속성이 있는데, 간단히 정리해보자여기에 그림 설명 삽입
2. 수업 로딩 과정에 대한 간략한 소개
여기에 그림 설명 삽입
파싱을 시작했을 때 소스 코드를 보내는 중 여기에는 spl_autoload_register
그런 다음
포함파일이 반환될 때까지 파일을 가져오기만 하면 됩니다.
지금까지 수업에 대한 완전한 자동 로딩 분석이 이루어졌습니다.
여기서 끝나지만 한 가지 언급해야 할 점이 있습니다:
$classMap이 속성은
classmap.php는 여기에 있습니다. 이 파일을 생성하려면
php 생각 최적화:자동 로드생성되었습니다. 이 파일이 생성되지 않은 경우 프로그램은 어떻게 실행됩니까? 이전 프로세스는 모두 동일하며
findFile이건 다른데 간단히 정리해보자. 현재로서는 코드가 classMap을 따르지 않습니다
먼저 thinkError 파일을 구합니다
그런 다음 Composer의 자동 로딩에서 두 속성을 통해 네임스페이스를 구하고 thinkError.php 파일을 splice합니다
반환된 최종 결과도D:phpstudy_proWWWThinkPHPSourceCodeAnalysisthinkphplibrarythinkError.php이 파일입니다.
여기 코드를 주의 깊게 읽어야 합니다.
여기서는 수업 자동 로딩이 완전히 끝났습니다.
3. 사용자 정의 파일을 사용하여 클래스 자동 로드를 구현하는 방법
먼저 kaka 폴더를 만듭니다.
그런 다음 Kaka.php
파일을 컨트롤러 인덱스에 삽입하여 직접 액세스합니다. 클래스는 분명 오류를 보고할 텐데, 직접 접근할 수 있도록 어떻게 조작해야 할까요!
여기에 이미지 설명 삽입
이때 소스코드의 중요성이 드러납니다.등록함수, 확장 디렉터리가 로드됩니다register函数中,加载过extend目录
ThinkPHP는 로더 소스 코드 분석을 자동으로 로드합니다.
这时在加一个kaka这个目录,直接进行访问一下
没毛病,直接就出来了。一切OK在这里在聊一下关于extent的加载方式
在之前聊注册自动加载类库目录只是说明了一下只是把路径存到了$fallbackDirsPsr4
여기에 이미지 설명을 삽입하세요카카 디렉토리를 추가하겠습니다. 직접 방문해보세요
문제 없습니다. 바로 나왔습니다. 모든 것이 정상입니다
여기서는 Extent의 로딩 방법에 대해 이야기해보겠습니다앞서 자동 로딩 클래스 라이브러리 디렉터리 등록에 대해 이야기할 때, 단지 경로를
$fallbackDirsPsr4속성에 대해서는 자세히 설명하지 않겠습니다. . 소스코드 읽기는 구현 후 확인을 통해서만 가능합니다
여기에 이미지 설명 삽입