이 기사는 thinkphp의 로더 자동 로딩에 대한 관련 지식을 제공합니다. 주로 Composer 로딩에 대한 관련 지식이 포함되어 있어 모든 사람에게 도움이 되기를 바랍니다.
1. 자동 로딩 로더 소스 코드 분석
1-1 학습 목표
클래스를 자동으로 로드하는 두 가지 방법
1-2 Composer 로딩
여기에 이미지 설명 삽입base.php 로더 클래스에서 먼저 로드한 후 등록 메소드 호출 .
thinkphplibrarythinkLoader.php에 오시면 등록 메소드가 있습니다. 이 메소드에서는 먼저 첫 번째 지식 포인트 spl_autoload_register()를 배우고 과거와 현재의 삶과 spl_autoload_register의 간단한 사용법에 대해 이야기합니다. .
다음 단계는 프로젝트의 루트 경로와 작곡가의 경로입니다.
여기에 그림 설명을 삽입하세요
여기서부터 작성기 파일을 로딩하는데, 과정도 매우 간단합니다
작곡가가 디렉터리인지 확인여기에 코드 조각이 있습니다. self::${$attr} = $composerClass::${ $attr} ;, 여기서 $attr은 'prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'의 데이터이며 $ 기호가 외부 레이어에 추가됩니다. .
addNamespace 메소드에서 Psr4 공간을 추가합니다
그런 다음 addPsr4 메소드로 이동하여 두 네임스페이스를 모두 ComposerStaticInit1e269472f484e157e90227b420ffca7a 클래스에 등록합니다. sr4 및 두 속성 중 $ prefixDirsPsr4,
는 위의 내용을 확인하고 중단점 디버깅을 만드는 데 사용됩니다. 특성에 대해서는 동일한 등록 방법이 사용됩니다.여기까지 네임스페이스 등록이 완료되었습니다. 다음으로는 psr4 네임스페이스가 무엇인지 알아보겠습니다.
1-4 Psr4psr은 단순히 파일 경로와 해당 클래스를 자동으로 로드하기 위한 관련 사양으로 이해됩니다. 현재 TP5.1은 psr4 사양을 사용합니다
여기서 클래스는 클래스를 의미합니다. , 인터페이스, 슈퍼 클래스 구조완전한 클래스에는 다음 구조가 필요합니다()*다음 사양은 PHP 문서에서 파생되었습니다.완전한 클래스 이름에는 다음이 있어야 합니다. "공급업체 네임스페이스"라고 하는 최상위 네임스페이스.
전체 클래스 이름에는 하나 이상의 하위 네임스페이스가 있을 수 있습니다.
전체 클래스 이름에는 최종 클래스 이름이 있어야 합니다.
전체 클래스 이름의 밑줄은 특별한 의미가 없습니다.
전체 클래스 이름은 대문자와 소문자로 구성될 수 있습니다.
모든 클래스 이름은 대/소문자를 구분해야 합니다.
다음은 공식적인 예입니다. 이 psr 사양을 이해할 수 있다면 이해해 보세요
1-5 클래스 라이브러리 매핑 파일 로드
이 시점에서 분명히 다음이 있을 것입니다. 질문, 여기서 무슨 일이 일어나고 있는 걸까요? classmap.php 파일이 없습니다.
서두르지 말고 당황하지 말고 먼저 php를 실행하여 파일을 가져오세요
마지막으로 addClassMap 메소드에 도달하게 됩니다. 이 메소드에서는 데이터를 할당하기만 하면 됩니다. $classMap에 classmap.php 파일을 추가하는 것 외에 다른 용도는 없습니다
1-6 확장 디렉터리를 자동으로 로드합니다.
extend 이 디렉터리는 TP 프레임워크를 사용하는 모든 사용자가 사용했습니다. 클래스는 이 디렉토리 라이브러리 파일에 저장될 수 있습니다.
아래 그림에서 볼 수 있듯이 addAutoLoadDir 메소드를 사용하여 로드합니다.
메소드에서는 $fallbackDirsPsr4 속성에 확장 경로만 할당합니다.
이걸로 Loader::register() 부분을 마치겠습니다. 그러면 내부 구현과 실제 사례를 자세히 살펴보겠습니다.
위 리딩 소스코드에는 4가지 속성이 있습니다. 간단히 정리하자면
2. 클래스 로딩 과정을 간략하게 설명해주세요
여기에 그림 설명을 삽입하세요
여기서 소스 코드를 분석하기 시작했을 때 spl_autoload_register 함수가 있었습니다
사용할 클래스가 도입되지 않은 경우 PHP가 오류를 보고하기 전에 이 함수가 트리거되고 정의되지 않은 클래스 이름이 다음과 같이 전달됩니다. 매개변수는 여기로 직접 이동합니다. think\Loader::autoload 메소드를 실행합니다
중단점 이후 첫 번째 언로드된 클래스는 thinkError
왜 thinkError입니까! thinkphp/base.php로 돌아가서 보면 자동 로딩이 완료되면 가장 먼저 실행되는 클래스는 Error
이고 간단하게 테스트를 해보고 Error를 Kaka로 변경하면 된다. 인쇄해 보세요. 이때 클래스는 Kaka로 변경됩니다. 이 시점에서 모든 사람은 이 클래스의 자동 로딩 메커니즘을 어느 정도 이해하고 있습니다.
사용된 클래스가 도입되지 않은 경우 이 클래스는 thinkphp/library/think/Loader.php의 자동 로드 메소드에 매개변수로 전달됩니다.
여기로 와서 자동 로드 방법을 살펴보세요
먼저 findFile 메서드로 시작하고 이름 없는 클래스를 이 메서드에 전달합니다. findFile 메서드에서는 classMap 속성에서 직접 가져옵니다. thinkError 클래스에 의해 매핑된 파일을 직접 반환합니다
thinkError 클래스의 전체 경로를 autoload의 파일 변수에 반환한 후 win 환경의 경우를 한 번 판단합니다.
그런 다음 include를 사용하여 파일이 반환될 때까지 파일을 소개하세요.
여기까지 수업 자동 로딩 분석이 완료되었습니다.
여기서 끝나지만 $classMap 속성에 대해 언급해야 합니다. 이 속성은 classmap.php 파일을 기반으로 합니다. 이 파일을 생성하려면 php optimize:autoload 명령을 실행해야 합니다.
이 파일이 생성되지 않은 경우 프로그램은 어떻게 실행됩니까?
이전 과정은 모두 동일하고, findFile만 다릅니다. 간단히 정리하겠습니다.
이때 코드는 절대로 classMap을 거치지 않습니다
먼저 thinkError 파일을 구합니다
그런 다음 Composer 자동 로딩에서 두 속성을 통해 네임스페이스를 구하고 thinkError.php 파일을 스플라이스합니다
반환된 최종 결과는 D:phpstudy_proWWWThinkPHPSourceCodeAnalyticthinkphplibrarythinkError.php 파일이기도 합니다.
여기 코드를 주의 깊게 읽어야 합니다.
여기서는 수업 자동 로딩이 완전히 끝났습니다.
3. 사용자 정의 파일을 사용하여 클래스 자동 로딩을 구현하는 방법
먼저 kaka 폴더를 만듭니다
그런 다음 직접 액세스를 위해 컨트롤러 인덱스에 Kaka.php 파일을 삽입합니다. 이 클래스는 확실히 보고합니다. 오류인데 직접 접근할 수 있도록 어떻게 조작해야 할까요?
여기에 그림 설명 삽입
이때 소스 코드의 중요성이 드러납니다. 자동으로 로드되는 등록 기능에서는 확장 디렉터리가 로드되었습니다
여기에 그림 설명을 삽입하세요
이것입니다. 카카 디렉토리 추가해서 바로 접속했어요
문제없어요, 바로 나왔어요. 이제 Extent
의 로딩 방법에 대해 이야기해보겠습니다. 자동 로딩 클래스 라이브러리 디렉터리 등록에 대해 이야기할 때, 자세한 내용은 들어가지 않고 $fallbackDirsPsr4 속성에 대한 경로만 저장했다고만 설명했습니다. 다음 단계는 이것을 설명하는 것입니다.
소스 코드를 읽는 유일한 방법은 구현한 다음 보는 것입니다
여기에 그림 설명을 삽입하세요
정의된 클래스를 입력하면 자동 로딩을 위해 자동 로딩이 됩니다
됩니다. 또한 findFile 메소드를 입력하세요findFile 메소드에서 이 코드를 볼 수 있습니다. 이 속성은 확장 디렉토리가 자동으로 로드될 때 $fallbackDirsPsr4 속성에 추가됩니다.
findFile에서 매개변수 클래스를 출력할 때 데이터를 보면
testKaka 클래스가 확연히 보입니다
이때, $fallbackDirsPsr4 속성에 반환된 파일을 출력해 보세요
그런 다음 __include_file을 사용하여 우리가 정의한 파일을 D:phpstudy_proWWWWThinkPHPSourceCodeAnalytickakatestKaka.php에 직접 포함시킵니다.
위 커스텀 파일은 어떻게 클래스의 자동 로딩을 구현하며, 이는 확장의 로딩 방법이기도 합니다
(권장 학습:thinkphp5
)위 내용은 ThinkPHP의 로더 자동 로딩을 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!