ThinkPHP5의 _initialize() 초기화 방법 분석

藏色散人
풀어 주다: 2021-03-18 08:54:21
앞으로
5075명이 탐색했습니다.

다음 튜토리얼 칼럼인 thinkphp에서는 ThinkPHP5의 _initialize() 초기화 방법을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

ThinkPHP5의 _initialize() 초기화 방법 분석

ThinkPHP5의 _initialize() 초기화 방법에 대한 자세한 설명

Foreword

_initialize() 이 방법은 공식 매뉴얼에 나와 있습니다: _initialize() 这个方法在官方手册里是这样说的:

如果你的控制器类继承了thinkController类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行。

其实不止5,在之前的版本中也出现过,这里和大家聊一聊它的实现过程吧。

示例

下面是官方手册上给的示例:

namespace app\index\controller;

use think\Controller;

class Index extends Controller
{

    public function _initialize()
    {
        echo 'init<br/>';
    }

    public function hello()
    {
        return 'hello';
    }

    public function data()
    {
        return 'data';
    }
}
로그인 후 복사

如果访问

http://localhost/index.php/index/Index/hello
로그인 후 복사

会输出

init
hello
로그인 후 복사

如果访问

http://localhost/index.php/index/Index/data
로그인 후 복사

会输出

init
data
로그인 후 복사

分析

因为使用必须要继承thinkController类,加上这个又是初始化,所以我们首先就想到了thinkController类中的 __construct(),一起来看代码:

/**
     * 架构函数
     * @param Request    $request     Request对象
     * @access public
     */
    public function __construct(Request $request = null)
    {
        if (is_null($request)) {
            $request = Request::instance();
        }
        $this->view    = View::instance(Config::get('template'), Config::get('view_replace_str'));
        $this->request = $request;

        // 控制器初始化
        if (method_exists($this, '_initialize')) {
            $this->_initialize();
        }

        // 前置操作方法
        if ($this->beforeActionList) {
            foreach ($this->beforeActionList as $method => $options) {
                is_numeric($method) ?
                $this->beforeAction($options) :
                $this->beforeAction($method, $options);
            }
        }
    }
로그인 후 복사

细心的你一定注意到了,在整个构造函数中,有一个控制器初始化的注释,而下面代码就是实现这个初始化的关键:

// 控制器初始化
if (method_exists($this, '_initialize')) {
    $this->_initialize();
}
로그인 후 복사

真相出现了有木有?!

其实就是当子类继承父类后,在没有重写构造函数的情况下,也自然继承了父类的构造函数,相应的,进行判断当前类中是否存在 _initialize 方法,有的话就执行,这就是所谓的控制器初始化的原理。

延伸

如果子类继承了父类后,重写了构造方法,注意调用父类的__construct()哦,否则是使用不了的,代码如下:

public function __construct()
{
    parent::__construct();
    ...其他代码...
}
로그인 후 복사

总结

一个简单的小设计,这里抛砖引玉的分析下,希望对大家有帮助。

链接

相关手册页面:http://www.kancloud.cn/manual/thinkphp5/118049

컨트롤러의 경우 클래스가 thinkController 클래스를 상속받은 경우 컨트롤러의 메서드가 호출되기 전에 먼저 실행되는 컨트롤러 초기화 메서드 _initialize를 정의할 수 있습니다.
🎜사실 5개 이상이 있는데, 이전 버전에도 등장했습니다. 구현 과정에 대해 말씀드리겠습니다. 🎜🎜Example🎜🎜다음은 공식 매뉴얼에 나오는 예시입니다. 🎜rrreee🎜 🎜rrreee🎜에 접속하면 🎜rrreee🎜가 출력됩니다. 🎜rrreee🎜에 접속하면 🎜rrreee🎜Analytic🎜🎜이 출력됩니다. 사용은 thinkController 클래스를 상속해야 하며 이는 초기화이므로 먼저 thinkController 클래스의 __construct()를 생각했습니다. 코드를 살펴보겠습니다. 함께: 🎜rrreee🎜조심하세요 전체 생성자에 컨트롤러 초기화에 대한 주석이 있고 다음 코드가 이 초기화를 달성하는 열쇠라는 것을 눈치채셨을 것입니다. 🎜rrreee🎜진실이 드러났나요? ! 🎜🎜실제로 자식 클래스가 부모 클래스를 상속받게 되면 생성자를 다시 작성하지 않고도 자연스럽게 부모 클래스의 생성자를 상속하게 됩니다. 이에 따라 현재 클래스에 _initialize가 있는지 판단하게 됩니다. 메소드가 있으면 실행됩니다. 이것이 소위 컨트롤러 초기화의 원리입니다. 🎜🎜Extension🎜🎜하위 클래스가 상위 클래스를 상속하고 생성자 메서드를 다시 작성하는 경우 상위 클래스의 __construct()를 호출하도록 주의하세요. 그렇지 않으면 코드는 다음과 같습니다. 🎜 rrreee🎜Summary 🎜🎜간단하고 작은 디자인, 여기에 간단한 분석이 있습니다. 모두에게 도움이 되기를 바랍니다. 🎜🎜Link🎜🎜관련 매뉴얼 페이지: http://www.kancloud.cn/manual/thinkphp5/118049🎜🎜

위 내용은 ThinkPHP5의 _initialize() 초기화 방법 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿