実際には 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
ログイン後にコピー
にアクセスすると、
http://localhost/index.php/index/Index/hello
init hello
http://localhost/index.php/index/Index/data
が出力されます
init data
Analysis
使用は
\think\Controllerクラスを継承する必要があり、さらにこれは初期化であるためですそこで、最初に
\think\Controllerクラスの
__construct() を考えました。コードを見てみましょう: <div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">ログイン後にコピー</div></div>
注意してください。コンストラクター全体に、コントローラーの初期化に関するコメントがあり、次のコードがこの初期化を達成するための鍵であることに気づいたはずです: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">// 控制器初始化
if (method_exists($this, '_initialize')) {
$this->_initialize();
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
真実は明らかになりましたか? ! 実際には、子クラスが親クラスを継承する場合、コンストラクタをオーバーライドすることなく、自然に親クラスのコンストラクタを継承することになり、それに応じて現在のクラスに
コントローラー初期化
原則です。 Extensionサブクラスが親クラスを継承し、コンストラクター メソッドを書き換える場合は、親クラスの
__construct() を呼び出すことに注意してください。そうしないと、このメソッドは使用されません。コードは次のとおりです。
public function __construct() { parent::__construct(); ...其他代码... }
リンク