>  기사  >  PHP 프레임워크  >  ThinkPHP 파사드 소스 코드 분석

ThinkPHP 파사드 소스 코드 분석

咔咔
咔咔원래의
2020-11-05 12:02:372175검색
"

이 글에서는 주로 Facade의 사용 및 구현 과정을 설명하고, 소스코드를 분석합니다.

"

Foreword

프레임워크를 사용하는 파트너는 프레임워크를 알고 있어야 합니다. 5.1의 새로운 기능 중 하나가 추가되었는데, 이는 이 글에서 작성할 Facade, 즉 Facade 기능입니다.

이 기능을 사용해 본 사람이라면 누구나 static 키워드를 사용하여 정의하지 않고도 메소드 호출을 정적으로 직접 호출할 수 있다는 이점을 이해하고 있을 것입니다.

다음으로 Kaka는 다음과 같은 측면에서 파사드의 이야기를 탐구하도록 안내합니다.

1. 프레임워크에서 Facade의 이점을 간략하게 이해합니다.

이전에 구성 파일 로딩에 대한 기사를 썼고, 기사 마지막 부분에서 구성 정보를 얻는 여러 가지 방법을 언급했습니다.

메소드 중 하나는 Config::get()입니다. 이 글에서는 Config를 사용하여 구성 정보를 얻을 때 먼저 use thinkfacadeConfig,又因为在系统中注册了别名,所以直接使用use Config를 도입해야 한다는 점을 알아야 합니다.

우리는 thinkfacadeConfig 사용 호출되는 실제 메소드는 thinkphp/library/think/ <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); 글꼴 - 계열: 연산자 Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">__callStaticMethod. use thinkfacadeConfig,但是实际调用的方法却是thinkphp/library/think/Facade.php中的__callStatic方法。

然后会执行同文件的createFacade方法。

虽说现在还没有看源码,看着知道就好了,在调用createFacade方法时是直接从容器类里边获取的。

在学习容器时我们都知道容器是使用了注册树模式,需要使用对应对象实例的时候就可以直接获取,这样就避免了一个类反复的创建。这就是其中的一个优点。利用容器的特性

对于以前使用config来说,需要使用config的命名空间,然后进行实例化才能进行调用。

如果此时config不让使用了,需要使用自己创建的config类,如果没有使用门面模式,就需要修改大量的代码,而且是全局的。

但是如果使用了框架中的facade门面模式之后,你就只需要重写getFacadeClass

그런 다음 createFacade 방법.

컨테이너를 배울 때, 우리 모두는 컨테이너가 등록 트리 모드를 사용한다는 것을 알고 있습니다. 해당 객체 인스턴스를 사용해야 할 때 직접 얻을 수 있으므로 클래스가 반복적으로 생성되지 않습니다. 그것이 장점 중 하나입니다. 컨테이너의 특성을 활용이전 config를 사용하려면 config의 네임스페이스를 사용한 후 호출하기 전에 인스턴스화해야 합니다.

이번에 config 사용이 허용되지 않는 경우에는 생성한 config 클래스를 사용해야 하며, Facade 모드를 사용하지 않는 경우 코드를 많이 수정해야 하며 전역적입니다.

하지만 프레임워크에서 Facade 모드를 사용하는 경우 getFacadeClass이 메소드로 충분합니다. 다른 파일에서 인스턴스를 호출할 때 인스턴스가 무엇을 호출하는지 신경 쓰지 않고 반환 결과만 변경하거나 직접 정의하면 됩니다. 메소드 이름을 지정하고 결과를 반환합니다.

🎜🎜🎜 2. 학습 프레임워크에서 Facade 활용 🎜🎜🎜🎜🎜먼저 Controller Facade를 생성하고 다음 내용을 작성합니다. 🎜🎜여기에서는 간단히 Facade 메소드를 사용하여 구성 파일 정보를 얻습니다. 🎜

ThinkPHP 파사드 소스 코드 분석여기에서 구성 사용 , 이는 구성 클래스의 별칭입니다. <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">use Config,这个就是config类的别名。

别名的设置是在base.php

별칭 설정은 base.php 설정했습니다.

ThinkPHP 파사드 소스 코드 분석프레임워크에서 Facade를 올바르게 사용하는 방법!

Facade 클래스를 구체적으로 저장하려면 앱 디렉토리에 새 폴더 Facade를 만듭니다.

Sessions 클래스가 여기에 생성됩니다.

ThinkPHP 파사드 소스 코드 분석

먼저 코드에 문제가 있는지 테스트해 보세요. 컨트롤러의 Facade 파일에서 테스트하세요.

파사드를 사용하지 않을 때 처리하는 방식입니다. 해당 클래스를 도입한 후 인스턴스화한 다음 인스턴스화된 클래스를 사용하여 메서드를 호출해야 합니다.

ThinkPHP 파사드 소스 코드 분석

결과를 인쇄하세요. 결과는 우리가 기대했던 것입니다.

ThinkPHP 파사드 소스 코드 분석

이 코드를 파사드 모드로 어떻게 변경하나요? 카카의 발자취를 한걸음 한걸음 따라가보세요.

먼저 kaka 디렉터리에 facade와 util이라는 두 개의 디렉터리를 만듭니다

ThinkPHP 파사드 소스 코드 분석

왜 이 두 폴더를 만들어야 할까요! util은 도구 클래스이고 이 클래스 파일은 다른 프로젝트에서 공유될 수 있다는 것을 누구나 알아야 합니다.

즉, 하나의 복사본만 구현한 다음 다른 프로젝트에서 직접 사용하면 됩니다.

그러므로 파일을 util 디렉토리에 직접 복사할 수 있습니다. 네임스페이스만 수정하면 됩니다. 🎜

ThinkPHP 파사드 소스 코드 분석그런 다음 Facade 디렉터리에 새 Sessions 클래스를 만들고 Facade를 상속합니다. 그런 다음 내용을 작성합니다.

ThinkPHP 파사드 소스 코드 분석지금 우리는 컨트롤러를 테스트하기 위해 왔습니다.

결과는 이전과 동일하지만 분명한 차이점은 Facade 모드를 사용한 후 정적 메서드를 직접 사용하여 호출할 수 있다는 것입니다.

파사드의 장점 중 하나에 대해 앞서 언급한 것을 기억하시나요?

이 세션 도구 클래스가 앞으로 더 이상 사용되지 않을 것이라고 가정하면 getFacadeClass 메서드의 콘텐츠만 수정하면 됩니다.

ThinkPHP 파사드 소스 코드 분석ThinkPHP 파사드 소스 코드 분석

3. 프레임워크에서 Facade 사용 최적화

위에서는 클래스 인스턴스화부터 Facade 사용까지 동일한 기능을 구현했습니다.

원하는 효과가 표시되지만 코드는 여전히 간결하고 아름답지 않으며 구조도 비교적 혼란스럽습니다.

다음으로는 카카가 실현 가능한 계획을 제시해드릴 테니, 다른 계획이 있으시면 올려주셔도 됩니다! 댓글 섹션에서 뵙겠습니다.

일반적인 개발 작업에서는 하나 또는 소수의 맞춤형 파사드 클래스만 갖는 것은 불가능합니다. 복잡한 프로젝트에서는 파사드 클래스가 많이 있습니다.

많아서 관리가 필요해요.

ThinkPHP 파사드 소스 코드 분석먼저 Facade에 속하는 구성 클래스를 만듭니다.

프록시 클래스를 실제 클래스와 매핑한 다음 별칭을 설정합니다.

ThinkPHP 파사드 소스 코드 분석이때 Hook 파일을 생성하고 그 안에 Facade 클래스 등록과 Facade 카테고리 이름 등록을 넣어 실행해야 합니다.

ThinkPHP 파사드 소스 코드 분석마지막 단계는 후크 파일이 생성되었지만 실행되지는 않는 것입니다.

그럼 Hook 파일은 언제 실행해야 할까요? 즉, 애플리케이션이 초기화될 때 로드하는 것입니다.

TP5.1에 적용된 초기 구성은 응용 프로그램 /tags.php이 파일에 있습니다. application/tags.php这个文件中。

在应用初始化的配置项里把钩子文件配置进去即可。

ThinkPHP 파사드 소스 코드 분석测试

最后一步就是测试了,依然是执行application/index/controller/Facade.php文件中的getUserInfo

애플리케이션 초기화 구성 항목에서 후크 파일을 구성하면 됩니다.

ThinkPHP 파사드 소스 코드 분석테스트

ThinkPHP 파사드 소스 코드 분석마지막 단계는 테스트하는 것입니다.<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: application/index/controller/Facade.php 파일 4px; 여백: 0 2px; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Menlo, monospace: break-all; 271, 93, 108);">getUserInfo 메소드. ThinkPHP 파사드 소스 코드 분석

테스트 결과에 따르면, 저희 솔루션의 코드 작성에는 문제가 없음을 알 수 있습니다.

🎜🎜 여기서 문제를 발견하셨나요? 즉, Facade 클래스의 별칭이 Hook에 정의되어 있지만 여기서는 사용되지 않습니다. 🎜🎜다음으로 별칭을 사용하여 테스트합니다. 🎜

ThinkPHP 파사드 소스 코드 분석ThinkPHP 파사드 소스 코드 분석

4. Facade 클래스 소스코드 분석

소스코드를 파싱하기 전에 먼저 두 가지 방법을 알아두세요.

  • __callStatic: is not 이 메소드는 정적 메소드가 존재할 때 호출됩니다.
  • __callStatic:当访问不存在的静态方法时,会调用此方法。
  • call_user_func_array:可以直接用此函数来直接调用函数。
  • 我们就从获取配置文件开始解析

    ThinkPHP 파사드 소스 코드 분석执行Config::get('facade.');会执行到文件thinkphp/library/think/facade/Config.php中。

    在这个文件中就是之前说的,如果存在getFacadeClass

    call_user_func_array code>: 이 함수를 사용하여 함수를 직접 호출할 수 있습니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">구성 파일을 가져와서 구문 분석을 시작하겠습니다</p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><img src="https://img.php.cn/upload/image/251/782/813/1604644009462115%20.%20png" alt="ThinkPHP 파사드 소스 코드 분석" style="max-width:90%" title="1604644009462115.png"> 실행<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,. 05 ); 글꼴 계열: 연산자 Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">Config::get('facade.'); 는 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba" operator mono consolas monaco menlo monospace word-break: break-all>thinkphp/library /think/facade/Config.php.

    🎜이 파일에는 앞서 언급한 것처럼 getFacadeClass 메소드는 해당 별칭을 직접 반환합니다. 🎜🎜존재하지 않는 경우에는 바인드 메소드를 사용하여 파사드를 바인딩해야 합니다. 🎜🎜여기서 이해가 되지 않는다면 문서로 가서 Facade 장을 잘 살펴보세요! 🎜

    ThinkPHP 파사드 소스 코드 분석위 클래스에는 get 메소드가 없으므로 직접 호출됩니다. <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px in the thinkphp/library/think/Facade.php ; 여백: 0 2px; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Menlo, monospace: break-all; , 93, 108);">__callStatic 메소드. thinkphp/library/think/Facade.php文件中的__callStatic方法。

    这个方法就是文章开头就直接说明的,访问不存在的静态的方法时则会调用此方法。

    ThinkPHP 파사드 소스 코드 분석接着就会执行本类中的createFacade这个方法

    在这个方法里边有一行代码是这个样子的$facadeClass = static::getFacadeClass();这段代码会在下文做详细的说明。

    因为在子类中也有同样的方法,在本类中也有同样的方法但是在本类中的方法是没有任何返回值的。

    这时你有没有一丝丝的困惑,这里使用的static到底会执行哪里的方法。或者这样想,为什么会执行子类的方法。

    保留这些疑问将会在下文给你细细的讲来,先来把门面类的源码看完。

    在这个方法中主要看我圈起来的几个地方。

    第一处就是从子类的getFacadeClass方法获取类的别名。

    第二处是当子类没有getFacadeClass

    이 메서드는 기사 시작 부분에 직접 설명되어 있습니다. 이 메서드는 존재하지 않는 정적 메서드에 액세스할 때 호출됩니다.

    ThinkPHP 파사드 소스 코드 분석그런 다음 createFacade이 방법🎜🎜이 방법에는 다음과 같은 코드 줄이 있습니다.$facadeClass = static::getFacadeClass();이 코드는 다음과 같습니다. . 🎜🎜하위 클래스에도 동일한 메서드가 있고 이 클래스에도 동일한 메서드가 있지만 이 클래스의 메서드에는 반환 값이 없기 때문입니다. 🎜🎜이때, 여기서 사용된 static이 어떤 메소드를 실행하게 될지 조금 헷갈리시죠? 아니면 서브클래스 메서드가 실행되는 이유를 이런 식으로 생각해 보세요. 🎜🎜이러한 질문을 계속해서 아래에서 자세히 설명하겠습니다. 먼저 Facade 클래스의 소스 코드를 읽어보겠습니다. 🎜🎜이 방법에서는 내가 동그라미 친 몇몇 곳을 주로 살펴보세요. 🎜🎜첫 번째는 getFacadeClass code> 메소드는 클래스의 별칭을 가져옵니다. 🎜🎜두 번째는 하위 클래스에 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color" : rgba operator mono consolas monaco menlo monospace word-break: break-all>getFacadeClass code> 메서드는 수동으로 바인딩된 속성에서 가져옵니다. 🎜🎜세 번째 부분은 이전 글에서 언급한 컨테이너입니다. 여기서는 자세히 설명하지 않겠습니다. 자세한 내용은 홈페이지를 클릭해 이전 글을 읽어보세요. 🎜<figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/181/259/937/1604644075360708.png" alt="ThinkPHP 파사드 소스 코드 분석" style="max-width:90%" title="1604644075360708.png"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">createFacade 메소드</figcaption></figure><h1 data-tool="mdnice编辑器" style="margin-top: 30px; margin-bottom: 15px; padding: 0px; color: black; border-top: 2px solid rgb(248, 57, 41); text-align: center; font-size: 1.3em;"> <span class="prefix" style="display: none;"></span><span class="content" style="display: inline-block; font-weight: normal; background: rgb(248, 57, 41); color: #ffffff; padding: 3px 10px 1px; border-radius: 0 0 13px 13px;"> 5. 정적 키워드 </span><span class="suffix"></span> </h1> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">여기서는 정적 키워드에 대해 설명해야 합니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">새로운 학습자는 아마도 static이 정적 변수와 정적 메서드를 정의하는 데 사용된다는 것만 알고 있을 것입니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">물론 여기서는 정적 메서드와 정적 변수를 정의하는 방법을 설명하지는 않지만 아주 아주 작은 세부 사항에 대해 이야기하겠습니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">먼저 예제를 살펴보겠습니다. 이 예제 역시 읽을 때 파사드의 소스 코드를 기반으로 Kaka가 적용한 것입니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">Kaka 여기에 test와 test1이라는 두 개의 새 파일이 생성되었습니다. </p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">test는 test1 파일을 상속하며 둘 다 동일한 getKaka 메소드를 갖습니다. </p> <figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/738/351/932/1604644093440177.png" alt="ThinkPHP 파사드 소스 코드 분석" style="max-width:90%" title="1604644093440177.png"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">두 개의 새 파일 만들기</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><span style="font-weight: 700; color: rgb(248, 57, 41);">테스트 소스 코드</span></p> <figure data-tool="mdnice编辑器" style="margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; border-radius: 16px; overflow: hidden;"><img src="https://img.php.cn/upload/image/560/656/885/1604644111681194.png" alt="ThinkPHP 파사드 소스 코드 분석" style="max-width:90%" title="1604644111681194.png"><figcaption style="margin-top: 5px; text-align: center; color: rgb(136, 136, 136); font-size: 12px;">테스트 소스 코드</figcaption></figure><p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><span style="font-weight: 700; color: rgb(248, 57, 41);">test1 소스 코드</span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><img src="https://img.php.cn/upload/image/880/120/975/1604644127851622.png" alt="ThinkPHP 파사드 소스 코드 분석" style="max-width:90%" title="1604644127851622.png"><span style="font-weight: 700; color: rgb(248, 57, 41);">호출할 컨트롤러</span></p> <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"><img src="https://img.php.cn/upload/image/941/520/842/1604644143486510.png" alt="ThinkPHP 파사드 소스 코드 분석" style="max-width:90%" title="1604644143486510.png"><span style="font-weight: 700; color: rgb(248, 57, 41);">결과 인쇄</span><img src="https://img.php.cn/upload/image/554/604/977/1604644262402387.png" alt="ThinkPHP 파사드 소스 코드 분석" style="max-width:90%" title="1604644262402387.png">이제 어떻게 인쇄해야 할까요? <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px ; 여백: 0 2px; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Menlo, monospace; 271 , 93, 108);">147 대신 456이 왔습니다!的 TEST1의 코드를 수정하고 정적을 seld147,而不是456呢!

    修改test1的代码,把static改为self

    ThinkPHP 파사드 소스 코드 분석打印结果

    ThinkPHP 파사드 소스 코드 분석使用self的代码相信大家都看的明白,那为什么使用static就出现了有可能不太明白的结果呢!

    此时就是文档开始起作用了,但是当你打开PHP文档会发现,在static这一篇中并没有对这类情况作出说明。

    经过咔咔多次测试和查阅资料,最终总结结果如下。

    static::$test  如果有被继承的话 默认调用子类 ,否则调用的是自身

    self::$test    如果有被继承的话,默认调用本类

    放在本实例中来说明就是,当test继承test1时。

    在test1中使用static调用方法getKaka时,默认调用的是test类中的getKaka

    🎜 E1502A13C1441afea03 633e6d61df67로 변경하세요. . png결과 인쇄🎜🎜ThinkPHP 파사드 소스 코드 분석self를 사용하면 누구나 코드를 이해할 수 있을 텐데, static을 사용하면 왜 명확하지 않은 결과가 나오는 걸까요? ! 🎜🎜이쯤 되면 문서가 효력을 발휘하기 시작하는데, PHP 문서를 열어보면 정적인 글에는 이런 상황에 대한 설명이 없다는 걸 알 수 있습니다. 🎜🎜카카에서 여러 테스트와 데이터 검토를 거쳐 최종 요약 결과는 다음과 같습니다. 🎜🎜static::$test 상속된 경우 기본적으로 하위 클래스를 호출하고, 그렇지 않은 경우 자체를 호출합니다🎜🎜self::$test 상속된 경우 기본적으로 이 클래스를 호출합니다🎜🎜설명됩니다. 이 예에서는 test가 test1을 상속하는 경우입니다. 🎜🎜test1에서 정적 호출 방법 사용getKaka , 기본 호출은 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31, 35,.05); 글꼴 계열: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">getKaka 서브클래스의 메소드 🎜<p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;">self를 사용하여 test1에서 메서드를 호출합니다<code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba( 27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Monaco, Menlo, monospace; 단어 구분: break-all;">getKaka > , 기본 호출은 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba (27,31) ,35,.05); 글꼴 계열: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all;">getKaka code> 이 클래스의 메소드입니다. <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0 2px; background-color: rgba(27,31,35,.05); font-family: Operator Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">getKaka时,默认调用的是test1类中的getKaka,也就是本类的方法。

    这个小小的细节也是咔咔无意中发现的,如果有什么不对的地方可以提出来,咔咔作出修改。

    因为在继承这方面还有另外一种情况,咔咔私下会进行测试,在这里就不说明了。

    这里对这个static做出解释主要是为了解释thinkphp/library/think/Facade.php

    이 작은 부분도 카카가 우연히 발견한 부분인데 잘못된 부분이 있으면 지적해주시면 카카가 수정하겠습니다.

    상속에는 또 다른 상황이 있기 때문에 카카가 비공개로 테스트할 예정이므로 여기서는 설명하지 않겠습니다.
    ThinkPHP 파사드 소스 코드 분석여기서 정적 설명은 주로 이 줄은 thinkphp/library/think/Facade.php 파일의 코드.
    이 코드 줄에서 호출되는 메서드는 하위 클래스와 상위 클래스 모두에 존재하므로 모두가 혼동하지 않도록 Kaka가 이를 작성하고 간략하게 소개하겠습니다.

    thinkphp/library/think/Facade.php

    6. Summary

    ThinkPHP 파사드 소스 코드 분석

    먼저 Facade 클래스의 구체적인 실행 과정을 보다 명확하게 보기 위해 Facade 흐름도를 살펴보겠습니다.

    Facade 클래스의 소스 코드는 매우 간단합니다. 몇 가지 일반적이지 않은 지식을 제외하면 누구나 코드를 이해할 수 있을 것입니다.

    주로 외관 카테고리를 읽은 후 간략한 요약을 작성하기 위한 것입니다. 🎜🎜Façade 클래스는 주로 컨테이너와 결합하여 구현한 함수입니다. 해당 인스턴스를 반환하려면 컨테이너가 필요하기 때문입니다. 컨테이너에 대해 잘 모르시는 분들은 여기를 읽어보세요. 기사 시작 부분에 해당 기사가 있습니다. 🎜🎜이 기사에서는 컨테이너에서 Facade를 사용하는 방법을 소개하고 최적의 사용 방법을 제공합니다. 여기서 가장 좋은 방법은 Kaka의 개인적인 의견입니다. Kaka는 거의 2년 동안 이 방법을 사용해 왔기 때문입니다. 🎜

    코드 견고성과 확장성 측면에서 매우 실용적입니다.

    그럼 static 키워드에 대해, 클래스가 클래스를 상속받을 때 상위 클래스에서 static 키워드를 사용하면 기본적으로 하위 클래스의 메서드가 호출된다는 사실을 모두에게 알려드리고자 합니다.

    여기 요약은 이 문서의 예에만 해당됩니다.

    사실 Kaka는 여기서 한 가지 사항을 설명하고 싶습니다: return call_user_func_array([static::createFacade(), $method], $params);return call_user_func_array([static::createFacade(), $method], $params);

    因为在以前的用法的哥参数就直接是方法,但是在这里碰到了数组形式,那么这个数组中的俩个值都代表的是什么呢!

    第一个值为实例,第二个值为实例中的方法。

    关于call_user_func_array

    이전 사용법의 매개변수는 직접 메서드였지만 여기서는 배열 형식을 만났기 때문에 다음은 무엇을 합니까? 배열의 두 값은 무엇을 나타냅니까?

    첫 번째 값은 인스턴스이고, 두 번째 값은 인스턴스의 메서드입니다.

    정보call_user_func_array 여기서는 사례를 보여주지 않겠습니다. 들어오는 메서드를 실행할 것이라는 점만 알면 됩니다.
    이걸로 Facade의 소스 코드 분석이 끝났습니다. 가장 중요한 것은 컨테이너를 이해하는 것입니다. 왜냐하면 Facade는 컨테이너를 기반으로 구현되기 때문입니다. 그래서 Kaka는 컨테이너를 먼저 작성한 다음 Facade를 작성합니다.

    또한 Kaka는 Facade 사용에 대한 계획도 제시했습니다. 더 나은 계획이 있으면 댓글 영역에서 대략적인 아이디어를 제공할 수 있습니다.

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

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

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