>PHP 프레임워크 >ThinkPHP >ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

咔咔
咔咔원래의
2020-12-04 12:57:26174검색

1. 컨트롤러에서 메소드 실행

본 글의 요청 주소는 구성된 도메인 이름입니다.

ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
요청 주소

위에서 알 수 있습니다$instance의 값은 appindexcontrollerIndex 코드> 인스턴스. <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);">$instance的值就是appindexcontrollerIndex的实例。

这块也是存在中间件的概念,依然如此中间件会在后文中单独提到,这里不做解释。

在这里$this->app['middleware']->controller这段代码的使用,还能记得是使用的ArrayAccess还是直接为__get吗?

这里是在使用访问数组的形式访问对象,所以使用的是ArrayAccess的形式,这俩种概念一定要区分清楚。

ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

接下来就会执行获取方法名,至于这个方法名怎么获取的是在本类的init方法执行的,这里只需要知道返回的是index

이것에도 미들웨어 개념이 있습니다. 그래도 마찬가지로 미들웨어에 대해서는 다음 글에서 따로 언급할 것이므로 여기서는 설명하지 않겠습니다. 🎜🎜여기$this->app['middleware' ]->controller 이 코드를 사용할 때 ArrayAccess인지 __get인지 기억할 수 있나요? 🎜🎜여기에서는 객체에 액세스하기 위해 배열 액세스 형식을 사용하므로 두 개념을 명확하게 구분해야 합니다. 🎜🎜반사를 통한 컨트롤러 실행 방법🎜reflection을 통해 컨트롤러 메소드를 실행🎜🎜🎜그러면 메소드 이름을 얻을 수 있습니다. 메소드 이름을 얻는 방법은 이 클래스에 있습니다. init 메소드가 실행되면 반환되는 내용이 색인그게 다입니다. 🎜

여기서 주목해야 할 것은 다음 코드 줄입니다.$this->rule->getConfig('action_suffix'),这里获取的是ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?。

ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

假如现在给这个ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?设置一个值会变成什么样子呢!

给添加一个kaka的值,进行访问一下看会是什么结果。

ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

这个时候进行访问会提示indexkaka的这个方法不存在,是不是清晰可见了,说明这个参数是在为所有的方法名追加一个kaka。

ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

对获取当前操作名的代码进行扩展完成之后,紧接着就是if (is_callable([$instance, $action])) {,在这里可以看见我们的老朋友is_callable

对于这里的is_callable俩个参数通过上文都知道是什么了,第一个参数为appindexcontrollerIndex的实例,第二个参数为index

작업 방법 접미사
작업 방법 접미사

이 작업 방법 접미사에 대한 값을 설정하면 어떤 모습일까요? 🎜🎜카카 값을 추가하고 액세스하여 결과가 어떻게 나올지 확인하세요. 🎜
테스트를 위해 카카가 추가되었습니다
테스트를 위해 kaka를 추가했습니다
🎜이때 접속하면 indexkaka 메소드가 존재하지 않는다는 메시지가 뜹니다. 명확하게 보이나요? 매개변수는 모든 메소드 이름에 카카를 추가합니다. 🎜
방문 결과
액세스 결과
🎜현재 작업 이름을 얻기 위한 코드 확장이 완료된 후 다음 단계는 if (is_callable([$instance, $action])) { 우리의 오랜 친구를 참조하세요is_callable 🎜🎜위에서 is_callable의 두 매개변수가 무엇인지 알 수 있습니다. 첫 번째 매개변수는 appindexcontrollerIndex의 인스턴스, 두 번째 매개변수는 index작업 방법을 실행합니다. 🎜

그런 다음 is_callable -크기: 14px; 단어 줄바꿈: 중단 단어; 패딩: 2px 4px; 여백: 0 2px; 글꼴 계열: 연산자 Mono, Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(271, 93, 108);">index메서드 이름을 실행할 수 있는지 여부입니다. is_callable的作用就是检测在appindexcontrollerIndex类中的index方法名是否可以执行。

很明显这里会返回一个true,因为在index类里边存在index方法的。

这里在做测试之前一定要把刚刚在app的配置文件中配置的方法名后缀那个给取消掉。

通过这个is_callable判断会存在三种情况,接下来咔咔将会从三个方面给大家进行解析。

第一种情况:类里边存在可执行的方法

  • 首先返回一个 ReflectionMethod 类
  • 获取方法名 index
  • 未设置方法名后缀返回空
  • 设置当前的操作名
  • 在这个案例中没有设置参数,所以最终的$vars
    인덱스 클래스에 인덱스 메소드가 있기 때문에 여기서는 분명히 true가 반환됩니다.
여기에서 테스트하기 전에 앱 구성 파일에서 방금 구성한 메서드 이름 접미사를 취소해야 합니다.

is_callable 이 경우 카카는 세 가지 측면에서 분석해보겠습니다.
ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?첫 번째 상황: 클래스에 실행 가능한 메소드가 있습니다
  • 먼저 ReflectionMethod 클래스를 반환합니다
  • 메서드 이름 인덱스 가져오기

  • 메소드 이름 접미사가 설정되지 않은 경우 비어 있음🎜🎜
  • 현재 작업 이름 설정🎜🎜
  • 이 경우에는 매개변수가 설정되지 않으므로 최종 $vars는 빈 배열입니다. 🎜🎜🎜🎜매개변수가 포함된 이 코드 조각을 테스트하려면 라우팅 주소를 약간 변경해야 합니다. 🎜🎜🎜🎜코드 일부 테스트🎜🎜🎜이전에는 라우팅을 사용하지 않고 기본 주소를 직접 사용했습니다. 다음에는 이 라우팅 주소를 사용하겠습니다.
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    새 라우팅 주소를 테스트용으로 사용

    이 라우팅 주소를 사용하여 데이터를 인쇄해 보면 우리가 설정한 라우팅 매개변수임을 알 수 있습니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    데이터 인쇄

    요청 변수를 얻는 이 방법은 $this->request->param();이 코드 줄$this->request->param();这行代码

    框架是如何获取参数的

    访问地址:http://www.source.com/index.php/hello/hello

    在上文知道是通过$this->request->param()来获取参数的,那么在框架是如何获取参数的呢!

    根据流程代码会执行到下图,根据获取的请求方式来使用对应的方式来获取参数,在这里需要明确的是我们使用的是get请求。

    所以代码会执行到$this->param

    프레임워크는 어떻게 매개변수를 얻나요?

    액세스 주소: http://www.source.com/index.php/hello/hello🎜🎜위에서 알 수 있듯이 $this->request->param() 매개변수 가져오기 , 그렇다면 프레임워크에서 매개변수를 어떻게 얻나요? 🎜🎜프로세스 코드에 따르면 아래와 같이 실행됩니다. 획득한 요청 방법에 따라 매개변수를 얻으려면 해당 방법을 사용하십시오. 여기서 분명히 해야 할 것은 get 요청을 사용한다는 것입니다. 🎜🎜그래서 코드는 $this-&gt ;param , 현재 요청 매개변수와 URL 주소의 매개변수가 여기에 병합됩니다. 여기서 원으로 표시된 부분에 주의하세요. 🎜🎜Kaka는 라우팅을 사용하여 요청을 하기 때문에 여기 프레임워크는 라우팅을 위한 요청 매개변수를 구체적으로 캡슐화합니다. 🎜
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    현재 요청의 매개변수 가져오기

    여기로 오세요route 메소드의 설명을 보면 라우팅 매개변수를 얻는 데 사용된다는 것을 알 수 있지만 여전히 입력 레이어에 들어가야 합니다. route方法,看到注释就明白是用来ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?的,但是还是需要在进入一层到input。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    在之前路由的那一期文章中在获取到路由参数的时候会把参数合并到request的route属性。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    所以说$this->route就是存放的这条路由规则所有的参数,包含路由参数。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    这时执行流程会执行到获取变量 支持过滤和默认值,在上文中$this->route

    라우팅 매개변수 가져오기🎜라우팅 매개변수 가져오기🎜🎜🎜이전 라우팅 기사에서 라우팅 매개변수를 얻으면 매개변수가 요청의 경로 속성에 병합됩니다. 🎜🎜라우팅 변수 설정🎜라우팅 변수 설정🎜🎜🎜$this->route는 라우팅 매개변수를 포함하여 이 라우팅 규칙의 모든 매개변수가 저장되는 곳입니다. 🎜🎜결과 인쇄🎜결과 인쇄🎜🎜🎜이때 필터링 및 기본값을 지원하는 변수를 얻기 위한 실행 프로세스가 실행됩니다. 위의 $this->route전달된 매개변수가 false이므로 이 블록은 직접 반환됩니다. 🎜
    获取变量 支持过滤和默认值
    변수 가져오기는 필터링 및 기본값을 지원합니다

    여기에 반환된 결과는 위에서 구문 분석을 시작한 위치, 즉 $vars는 얻은 라우팅 매개변수입니다. $vars就是获取到的路由参数。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    第二种情况:类里边不存在可执行的方法

    当第一种判断执行is_callable判断类里边的方法不可执行时,就会执行到第二种情况。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    先来请求的一个没有设置的路由地址,看会返回什么。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    根据代码给的提示,我们来到index控制器建立一个_empty

    반환된 라우팅 매개변수 결과🎜반환된 라우팅 매개변수 결과🎜🎜🎜 두 가지 상황: 클래스에 실행 가능한 메소드가 없습니다🎜🎜첫 번째 판단이 실행될 때is_callable 클래스 내의 메소드가 실행 가능하지 않다고 판단되면 두 번째 상황이 실행됩니다. 🎜🎜2차 실행 상황🎜두 번째 실행 사례🎜🎜🎜먼저 설정되지 않은 라우팅 주소를 요청하고 무엇을 반환할지 확인하세요. 🎜🎜오류 반환🎜Error return🎜🎜🎜 코드의 프롬프트에 따라 인덱스 컨트롤러로 이동하여 _empty 메소드를 실행한 다음 다시 요청하여 무슨 일이 일어나는지 확인하세요. 🎜
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    컨트롤러에서 _empty 메소드를 설정하세요

    인쇄 결과를 보면 액세스한 메소드가 존재하지 않을 때 이 메소드가 실행되는 것을 볼 수 있습니다_empty.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    결과 인쇄

    그럼 이 메서드는 어떻게 실행되나요? 이 실행 방법은 반사 메커니즘을 사용하여 달성됩니다. 이전에 반사 Kaka를 설명하는 특별 문서가 있지만 여전히 문서를 읽고 봐야 합니다.

    세 번째 경우: 클래스에 실행 가능한 메서드나 _empty 메서드가 없습니다

    이 경우는 비교적 간단하며, 오류 메시지를 직접 반환할 뿐입니다. 여기서 예외 처리에 대해서도 나중에 설명하겠습니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    세 번째 상황

    세 가지 상황을 실행한 후

    세 가지 상황을 분석한 후 최종적으로 통계적 방법이 구현됩니다.

    반사 실행 클래스를 호출하는 방법은 매개변수 바인딩을 지원합니다. 이는 여기서 클로저 실행 프로세스가 여기서 완료된다는 의미입니다.

    다음 자동 요청은 섹션 5에 자세히 설명되어 있습니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    통계적 실행

    2. 컨트롤러가 라우팅 주소를 인스턴스화하는 방법

    이전 섹션에서는 3~4주기에 대한 라우팅을 설명했고 마지막 설명은 라우팅 스케줄링입니다. 설정된 라우팅을 실행하는 방법!

    다음에는 이 경로를 케이스로 사용하세요

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    케이스 루트

    경로 감지를 시작했을 때 반환 값이 무엇인지 아직도 기억하시나요? 아래 사진을 봐주세요

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    경로 감지
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    결과 인쇄

    당시에는 아래 코드에 대한 자세한 설명이 없었는데, 제가 하고 싶은 말은 바로 컨트롤러의 인스턴스화였습니다. 이제 현재 일정 정보 기록 암호. 记录当前调度信息这行代码。

    在这里$this->request

    여기$this->request 존재하지 않는 속성에 액세스할 때 컨테이너 클래스의 매직 메서드를 실행하는 데 사용되며, 최종적으로 컨테이너를 통해 인스턴스를 반환합니다.

    그래서 코드는 현재 요청의 일정 정보를 설정하거나 얻기 위해 아래 표시된 위치에서 실행됩니다🎜
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    현재 요청의 일정 정보를 설정하거나 가져옵니다.

    컨트롤러 인스턴스화에서 여기를 인쇄하면 여기에 반환된 값이 index라는 것을 알 수 있습니다. 다음으로 컨트롤러로 이동합니다. 밖으로.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    데이터 인쇄

    라우팅 주소를 사용하여 init 메소드로 결과를 인쇄하여 결과를 볼 수 있습니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    데이터 인쇄
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    라우팅 주소 사용
    没有ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    라우팅 주소 없음

    여기 값이 왜 바뀌었는지 아시나요?

    위에 인쇄된 값은 아래 사진인데 왜 여기 위 사진인가요!

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    결과 인쇄

    라우팅 섹션의 마지막 단계는 라우팅 스케줄링을 시작하고 마지막으로 모듈/컨트롤러/작동 방법에 대한 라우팅을 호출하는 것입니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    경로 예약

    이 방법은dispatchModule 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);">dispatchModule最后也是实例化一个类,接下来需要对这个类进行深究

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    根据代码追踪可以看到其实就是thinkroutedispatchModule这个类

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    来到Module这个类,又会发现继承着Dispatch

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    thinkphp/library/think/route/Dispatch.php这个类的控制器中,会发现对dispatch

    모듈/컨트롤러로 라우팅 / Action🎜다음에 따라 모듈/컨트롤러/action🎜🎜🎜으로 라우팅됩니다. 코드 추적을 보면 실제로 thinkroutedispatchModule 코드>이 클래스 🎜🎜<img src="https://img-blog.csdnimg.cn/20201111141709893.png" alt="클래스 별칭" style="max-width:90%"> 클래스 🎜🎜🎜 별칭 제공<code style="font-size: 14px; break-word; ; 테두리 반경: 4px; 여백: 0 2px; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Monaco, word-break: break-all ; color: rgb (271, 93, 108);">모듈 이 클래스는 디스패치 클래스🎜🎜클래스 상속 🎜 thinkphp/library/think/route/Dispatch.php이 컨트롤러에서 클래스에서 dispatch 설정됩니다. 🎜
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    변수 할당

    뒤돌아서 이 시간을 살펴보세요모듈/컨트롤러/작업으로 경로 지정여기서 메소드에 전달된 매개변수는 무엇입니까, 하하ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?这里的方法传入的参数是什么,哈哈

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?的参数
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?的参数

    所以说最终的值就是刚刚打印的只是单独的数组形式的。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    那么接下来的动作就跟不使用路由访问的流程一样的,就不用在进行解析了。

    直到这里关于路由地址是怎么进行控制器实例化的就结束了。

    关于给$this->app->controller传入的是index,返回的是整个类名,具体的实现过程就不去解析了,实现的方法是$this->parseModuleAndClass

     모듈/컨트롤러/액션으로 라우팅되는 매개변수

    모듈로 라우팅 / 컨트롤러/작동의 매개변수그래서 최종 값은 그냥 별도의 배열 형태로 출력됩니다. 인스턴스화된 컨트롤러컨트롤러 인스턴스화

    그런 다음 다음 작업은 라우팅 액세스를 사용하지 않는 프로세스와 동일하므로 구문 분석할 필요가 없습니다.

    이것이 컨트롤러에서 라우팅 주소를 인스턴스화하는 방법의 끝입니다. 🎜🎜$this->app-> 색인 전체 클래스 이름이 반환되며 특정 구현 프로세스는 구문 분석되지 않습니다. 구현 방법은 $this->parseModuleAndClass를 통해 직접 조사할 수 있습니다! 🎜🎜🎜🎜🎜 3. autoResponse 스케줄링 실행 🎜🎜🎜🎜🎜 4번째 섹션에서는 실행 컨트롤러의 메소드가 아래 그림의 위치에서 반환된다는 것만 언급될 뿐, 반환 방법에 대해서는 자세히 설명하지 않습니다. 🎜🎜 다음으로 실행 방법에 대해 잠시 설명하는 시간을 갖도록 하겠습니다. 🎜
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    자동 요청

    접속 라우팅 주소는 아래와 같습니다. 반환된 데이터가 컨트롤러에서 반환해야 하는 데이터임을 알 수 있습니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    컨트롤러가 반환한 데이터
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    데이터 값을 인쇄합니다

    인쇄된 값은 아래 그림과 같습니다. 여기서는 명확해야 합니다. 소스 코드를 읽으려면 약간의 탐색이 필요하며 시간이 지나면 내용을 이해할 수 있습니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    인쇄 위치

    다음으로 $this ->autoResponse($data);심층적인 분석을 수행하는 방식입니다. 말 그대로 자동 응답을 의미합니다. $this->autoResponse($data);这个方法进行深入的解析,这个方法按照字面意思就是ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    在这个执行流程的第一行中$data instanceof Response

    자동 응답🎜자동 응답🎜🎜🎜이 실행 과정에서 첫 번째 줄에서$data 인스턴스of 응답 이것을 이해하지 못하면 읽을 수 없습니다. 🎜

    당신이 모르고 이해하지 못하는 것은 여전히 ​​해결되어야 합니다. 소스 코드를 읽고 조금씩 정복하면 승리할 수 있습니다.

    instanceof 사용 정보

    Instanceof는 객체가 특정 클래스의 인스턴스인지, 객체가 특정 인터페이스를 구현하는지 여부를 확인할 수 있습니다.

    다음으로 Kaka는 이를 설명하기 위해 간단한 예를 제공하고 무슨 일이 일어나고 있는지 이해하게 될 것입니다.

    케이스 1

    먼저 두 개의 클래스를 생성합니다. 케이스는 아래와 같습니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    데모 사례

    아래 그림은 인쇄 결과인데 첫 번째는 true를 반환하고 두 번째는 false를 반환하는 것을 볼 수 있습니다.

    는 객체가 특정 클래스의 인스턴스, 즉 $instance就是类Test의 인스턴스인지 확인하여 true를 반환합니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    결과 인쇄

    케이스 2

    케이스 2는 인터페이스가 설정되고 클래스가 인터페이스를 구현합니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?二
    데모 사례 2

    최종 반환 결과는 모두 true입니다. 즉, 클래스가 다른 인터페이스를 구현하면 판단 시 true가 된다는 의미입니다.

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    인쇄 결과

    위는 instanceof 주어진 두 가지 시연 사례에 대한 이해는 인스턴스가 특정 클래스의 인스턴스인지 여부를 결정하는 것입니다. instanceof给出的俩种ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?,对其理解就是判断一个实例是否为某个类的实例。

    那么就在回到正文,$data instanceof Response这行代码肯定不会成立,因为data传过来的就是控制器返回的值。

    所以说代码执行流程会执行到下图位置,使用了is_null

    그런 다음 텍스트로 돌아갑니다. $data instanceof Response 이 코드 줄은 전달된 데이터가 컨트롤러에서 반환된 값이기 때문에 확실히 작동하지 않습니다. <p data-tool="mdnice编辑器" style="padding-top: 8px; padding-bottom: 8px; line-height: 1.75; margin-top: 0.8em; margin-bottom: 0.8em;"></p>그래서 코드 실행 프로세스는 <code style="font-size: 14px; word-wrap: break-word; padding: 2px 4px; border-radius: 4px; margin: 0을 사용하여 아래 표시된 위치까지 실행됩니다. 2px ; 배경색: rgba(27,31,35,.05); 글꼴 계열: 연산자 Mono, Consolas, Monaco, monospace; 단어 나누기: break-all; ) ;">is_null 함수는 판단을 내립니다. 판단은 거짓이어야 하므로 다음 코드가 실행됩니다.

    이 코드의 처음 두 지점은 분석되지 않습니다.

    첫 번째는 기본적으로 응답 출력 유형을 자동으로 식별하는 것입니다. 이는 Ajax 요청인지 확인하기 위한 것입니다. 이번에는 Kaka가 프레임워크 소스 코드를 구문 분석할 때까지 기다렸다가 시간이 걸립니다. 매일 조금씩 프레임워크의 몇 가지 방법을 수행합니다. 🎜🎜두 번째 위치는 구성 파일에서 해당 구성 정보를 얻는 것입니다. 실행되는 규칙 클래스의 메소드를 살펴보는데, 메소드에는 구성 정보를 얻기 위해 실행되는 코드가 있습니다. 🎜
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    코드의 실행 프로세스가 실행되는 첫 번째 지점

    그 다음에는 위에서 언급하지 않은 세 번째 부분인 code$response = Response::create($data, $type);$response = Response::create($data, $type);

    来到类thinkphp/library/think/Response.php的方法create中,这个方法就是用来ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?。

    这里只需要去关注一下咔咔圈出来的地方即可,在thinkphp/library/think/response

    수업으로 오세요thinkphp/library/think/Response.php create, 이 메소드는 Response 객체를 생성하는 데 사용됩니다.

    여기서 thinkphp/library/think/response이 디렉토리에는 HTML이 없습니다.
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?그래서 코드는 이 클래스를 직접 인스턴스화한 다음 반환합니다.

    응답 개체 만들기

    🎜🎜이 클래스의 생성자에 오면 주로 몇 가지 작업을 수행합니다. 🎜
    • 이 클래스의 데이터 속성에 반환 값 할당
    • 페이지 출력 유형 설정
    • 반환 상태 코드
    • 앱 인스턴스 개체 설정
    • 헤더 정보
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    여기에 이미지 설명을 삽입하세요

    그런 다음 코드는 반환 값을 autoResponse$response 이 변수입니다. <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);">autoResponse这个方法的$response这个变量。

    最后就是将这个$response

    마지막으로 다음 $response 아래와 같이 결과를 반환하고 인쇄합니다.
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    여기에 그림 설명을 삽입하세요
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    반환 정보를 인쇄하세요

    그러면 코드는 여전히 상위 레이어로 돌아가 원래의 클로저 기능으로 돌아갑니다.

    Kaka가 동그라미 친 부분의 다음 코드도 미들웨어에 관한 것입니다. 최종 반환 결과가 그림에 인쇄된 결과와 동일하다는 점만 알아두시면 됩니다. 🎜
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    중급 수준으로 돌아가기

    최종 반환 결과는 thinkphp/library/think/route/Dispatch.php, 여기서부터 분석을 시작합니다. thinkphp/library/think/route/Dispatch.php,咱们也就是从这里开始的解析的。

    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?

    将返回的结果返回给$data,然后在进行执行return $this->autoResponse($data);

    你没看错,这里的代码熟悉吧!

    这个时候返回的结果就是Response的实例,所以会直接返回$response

    여기에 이미지 설명 삽입
    여기에 이미지 설명 삽입ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?
    반환된 결과를 $data 그런 다음 return $this->autoResponse( $data) ;

    읽으신 내용이 맞습니다. 여기에 있는 코드는 익숙할 것입니다!

    이번에 반환된 결과는 응답 인스턴스이므로 $response .

    🎜🎜🎜자동 응답🎜🎜🎜여기까지는 컨트롤러의 메서드가 실행되고 응답이 구문 분석됩니다. 🎜🎜설정된 라우팅 규칙이든 모듈 컨트롤러 방식을 사용한 직접 액세스이든 관계없이 응답 결과는 결국 위의 방법을 통해 반환됩니다. 🎜

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

  • 위 내용은 ThinkPHP 라우팅 주소는 어떻게 컨트롤러를 인스턴스화합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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