前書き
_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(); ...其他代码... }
概要
簡単です。ちょっとしたデザインです。ここでは簡単な分析を示します。皆さんのお役に立てれば幸いです。