Heim > PHP-Framework > Denken Sie an PHP > Analyse der Initialisierungsmethode _initialize() von ThinkPHP5

Analyse der Initialisierungsmethode _initialize() von ThinkPHP5

藏色散人
Freigeben: 2021-03-18 08:54:21
nach vorne
5097 Leute haben es durchsucht

Die folgende Tutorial-Kolumne von thinkphp stellt Ihnen die _initialize()-Initialisierungsmethode von ThinkPHP5 vor. Ich hoffe, dass sie Freunden in Not hilfreich sein wird!

Analyse der Initialisierungsmethode _initialize() von ThinkPHP5

Detaillierte Erklärung der _initialize()-Initialisierungsmethode von ThinkPHP5

Vorwort

_initialize() Im offiziellen Handbuch heißt es: _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';
    }
}
Nach dem Login kopieren

如果访问

http://localhost/index.php/index/Index/hello
Nach dem Login kopieren

会输出

init
hello
Nach dem Login kopieren

如果访问

http://localhost/index.php/index/Index/data
Nach dem Login kopieren

会输出

init
data
Nach dem Login kopieren

分析

因为使用必须要继承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);
            }
        }
    }
Nach dem Login kopieren

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

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

真相出现了有木有?!

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

延伸

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

public function __construct()
{
    parent::__construct();
    ...其他代码...
}
Nach dem Login kopieren

总结

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

链接

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

Wenn Ihr Controller die Die Klasse erbt die thinkController-Klasse. Sie können die Controller-Initialisierungsmethode _initialize definieren, die zuerst ausgeführt wird, bevor die Methode des Controllers aufgerufen wird.
🎜Tatsächlich gibt es mehr als 5, es ist auch in früheren Versionen erschienen. Lassen Sie mich mit Ihnen über den Implementierungsprozess sprechen. 🎜🎜Beispiel🎜🎜Das Folgende ist ein Beispiel im offiziellen Handbuch: 🎜rrreee🎜Wenn Sie auf 🎜rrreee🎜 zugreifen, wird 🎜rrreee ausgegeben. Wenn Sie auf 🎜rrreee zugreifen, wird es ausgegeben. 🎜rrreee🎜Analyse🎜 🎜Weil die Die Verwendung muss die Klasse thinkController erben, außerdem handelt es sich um eine Initialisierung. Daher haben wir zuerst an <code>__construct() in der Klasse thinkController gedacht. Schauen wir uns den Code an zusammen: 🎜rrreee🎜Vorsicht Sie müssen bemerkt haben, dass es im gesamten Konstruktor einen Kommentar zur Controller-Initialisierung gibt und der folgende Code der Schlüssel zum Erreichen dieser Initialisierung ist: 🎜rrreee🎜Ist die Wahrheit ans Licht gekommen? ! 🎜🎜Wenn eine untergeordnete Klasse die übergeordnete Klasse erbt, erbt sie natürlich den Konstruktor der übergeordneten Klasse, ohne den Konstruktor neu zu schreiben. Dementsprechend wird beurteilt, ob in der aktuellen Klasse _initialize vorhanden ist Es gibt eine Methode, die ausgeführt wird. Dies ist das Prinzip der sogenannten Controller-Initialisierung. 🎜🎜Erweiterung🎜🎜Wenn die Unterklasse die übergeordnete Klasse erbt und die Konstruktormethode neu schreibt, achten Sie darauf, den __construct() der übergeordneten Klasse aufzurufen, da er sonst nicht verwendet wird. Der Code lautet wie folgt: 🎜 rrreee🎜Zusammenfassung 🎜🎜Ein einfaches kleines Design, hier ist eine kurze Analyse, ich hoffe, es wird für alle hilfreich sein. 🎜🎜Link🎜🎜Zugehörige Handbuchseite: http://www.kancloud.cn/manual/thinkphp5/118049🎜🎜

Das obige ist der detaillierte Inhalt vonAnalyse der Initialisierungsmethode _initialize() von ThinkPHP5. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage