ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP5の初期化メソッド_initialize()の詳細説明

ThinkPHP5の初期化メソッド_initialize()の詳細説明

高洛峰
高洛峰オリジナル
2016-11-16 11:26:155475ブラウズ

前書き
_initialize() このメソッドは公式マニュアルに記載されています:

コントローラー クラスが thinkController クラスを継承する場合、コントローラーのメソッドが呼び出される前に最初に実行されるコントローラー初期化メソッド _initialize を定義できます。

実際には 5 つ以上あり、以前のバージョンにも登場しています。その実装プロセスについてお話しましょう。


以下は公式マニュアルに記載されている例です:

namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function _initialize()
    {
        echo &#39;init<br/>&#39;;
    }
    public function hello()
    {
        return &#39;hello&#39;;
    }
    public function data()
    {
        return &#39;data&#39;;
    }
}


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(&#39;template&#39;), Config::get(&#39;view_replace_str&#39;));
        $this->request = $request;
        // 控制器初始化
        if (method_exists($this, &#39;_initialize&#39;)) {
            $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, &#39;_initialize&#39;)) {
    $this->_initialize();
}

には、真実が明らかになった? !

実際、子クラスが親クラスを継承する際には、当然、コンストラクターを書き換えることなく、親クラスのコンストラクターを継承することになり、それに応じて、現在のクラスに _initialize メソッドがあるかどうかが判断されます。いわゆるコントローラーの初期化の原理です。

拡張
サブクラスが親クラスを継承してコンストラクターメソッドを書き換える場合、親クラスの__construct()を呼び出すように注意してください。そうしないと、コードは次のようになります:

public function __construct()
{
    parent::__construct();
    ...其他代码...
}

概要
簡単です。ちょっとしたデザインです。ここでは簡単な分析を示します。皆さんのお役に立てれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。