ホームページ >PHPフレームワーク >ThinkPHP >thinkphp の __construct() と __initialize() の概要

thinkphp の __construct() と __initialize() の概要

尚
転載
2020-04-24 09:22:451976ブラウズ

thinkphp の __construct() と __initialize() の概要

thinkphp の __construct() と _initialize() の理解について

インターネット上にはさまざまな意見や使い方がありますが、私自身でテストしてみました。テストでは、結果を自分の理解と組み合わせて結論を導き出します。間違いがある場合は、修正してください。 ! !

まず、Thinkphp に付属する Controlle クラスの内容を見てみましょう (ThinkPHP\Library\Think\Controller.class.php)

コンストラクターを見てみましょう:

/**
     * 架构函数 取得模板对象实例
     * @access public
     */
    public function __construct() {
        Hook::listen('action_begin',$this->config);
        //实例化视图类
        $this->view     = Think::instance('Think\View');
        //控制器初始化
        if(method_exists($this,'_initialize'))
            $this->_initialize();
    }

From Controller クラスのコンストラクターから、オブジェクトに _initialize メソッドがあるかどうかをコンストラクターが判断することがわかります。ある場合は、_initialize メソッドが最初に実行されます。は定義したコントローラー内にあります。

1): オーバーライドされたコンストラクターがあります:

①書き換えられたコンストラクターには、親クラス (parent::construct()) を実装するコンストラクターがあります。 ,

_initialize() メソッドがコントローラーで定義されている場合、コントローラーでメソッドを呼び出すと、最初に _initialize() メソッドが実行され、次に必要なメソッドが実行されます。コードを参照してください。 :

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
 
	public function __construct() {
		parent::__construct();
		self::b();
		echo &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
bbbb
我是构造
bbbb
这是index
*/

②: 親クラスのコンストラクターは、オーバーライドされた構造に実装されていません。メソッドが実行されるとき、定義された _initialize() メソッドは効果がありません (_initialize メソッドは実行されません)最初にメソッドが実行されるとき) )、コードを見てください:

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
 
	public function __construct() {
		// parent::__construct();
		self::b();
		echo &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
bbbb
我是构造
bbbb
这是index
*/

注: ここで説明されている _initialize() メソッドは、parent::__construct(); の前に関数呼び出しがないことを意味します。 do it inparent:: __construct(); self::b() が付属しています。b() が最初に実行される必要があることは言うまでもありませんが、通常はこのようには記述されません。一般に、

さらに、継承の場合、親クラスにコンストラクターがある場合、サブクラスは通常、コンストラクター内で最初に親クラスのコンストラクターを初期化し、サブクラスの独自性と整合性を確保します。コード

2) コンストラクターのオーバーライドはありません。つまり、定義するコントローラーで宣言されたコンストラクターはありません。

この場合、 _initialize() メソッドがコントローラーで定義されている場合、他のメソッドを呼び出すと、_initialize() メソッドが最初に呼び出されます。コードを見てください:

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
 
	// public function __construct() {
	// 	// parent::__construct();
	// 	self::b();
	// 	echo &#39;我是构造<br />&#39;;
	// }
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
bbbb
这是index
*/

さらに、_initialize() を使用して ## を継承することもできます。 #
<?php
namespace Home\Controller;
use Think\Controller;
class BaseController extends Controller {
	public function __construct() {
		parent::__construct();
 
		echo &#39;我是父类<br />&#39;;
	}
 
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
	}
 
	public function a() {
		echo &#39;aaaa<br />&#39;;
	}
}
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends BaseController {
 
	public function __construct() {
		parent::__construct();
		self::b();
		echo &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		parent::_initialize();
		echo &#39;我是子类先来<br />&#39;;
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
我是子类先来
我是父类
bbbb
我是构造
bbbb
这是index
*/

注: 親クラスparent::construct() にコンストラクターがない場合、定義された _initialize() も機能しません。

したがって、両方の __construct() が存在します (コンストラクターは初期化します)。親クラスのコンストラクター)と_initialize()、結局どっちを先に実行すればいいのでしょうか?

答えは、最初に _initialize() メソッドを実行することです。つまり、条件が満たされる場合は、コンストラクターを含むメソッドが実行される前に _initialize() 関数を実行する必要があります。

もちろん、実行するメソッド内で別のメソッドを呼び出した場合、それらのメソッドを追加で呼び出すと、_initialize() メソッドは再度実行されず、最初に呼び出したメソッドに関連付けられます。つまり、メソッド内で何が行われるかを制御することはできません。

推奨チュートリアル:

thinkphp チュートリアル

以上がthinkphp の __construct() と __initialize() の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。