実際には 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
Analysis
使用は
\think\Controllerクラスを継承する必要があり、さらにこれは初期化であるためですそこで、最初に
\think\Controllerクラスの
__construct() を考えました。コードを見てみましょう: <pre class="brush:php;toolbar:false">/**
* 架构函数
* @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);
}
}
}</pre>
注意してください。コンストラクター全体に、コントローラーの初期化に関するコメントがあり、次のコードがこの初期化を達成するための鍵であることに気づいたはずです: <pre class="brush:php;toolbar:false">// 控制器初始化
if (method_exists($this, '_initialize')) {
$this->_initialize();
}</pre>
真実は明らかになりましたか? ! 実際には、子クラスが親クラスを継承する場合、コンストラクタをオーバーライドすることなく、自然に親クラスのコンストラクタを継承することになり、それに応じて現在のクラスに
コントローラー初期化
原則です。 Extensionサブクラスが親クラスを継承し、コンストラクター メソッドを書き換える場合は、親クラスの
__construct() を呼び出すことに注意してください。そうしないと、このメソッドは使用されません。コードは次のとおりです。
public function __construct() { parent::__construct(); ...其他代码... }概要シンプルな小さな設計です。ここでは簡単な分析を示します。皆さんのお役に立てれば幸いです。
リンク