thinkphp編の_construct()と_initialize()
4244 ワード
thinkphpの__についてconstruct()と_initialize()の理解
ネット上で多くの言い方と使い方があって、自分でテストして、以下はテストの结果によってそして自分の理解を结び付けて出した结论で、もし间违った地方があるならば、みんなを歓迎して直します!!!
まずThinkphpが持っているControlleクラスの内容(ThinkPHPLibraryThinkController.class.php)を見てみましょう
コンストラクション関数を見てみましょう.
Controllerクラスのコンストラクション関数から分かるように、このコンストラクション関数はオブジェクトに_があるかどうかを判断します.initializeメソッド、ある場合は先_を実行Initializeメソッド
そのため、自分で定義したコントローラでは
1):書き換え構造関数があります.
①書き換え構造に親を実現するコンストラクション関数(parent::construct()),
コントローラに定義がある場合_Initialize()メソッドでは、コントローラのメソッドを呼び出すときに_を実行します.initialize()メソッドを実行し、コードを参照してください.
②:書き換えた構造に親のコンストラクタが実装されていない場合、メソッドを実行するときに定義される_Initialize()メソッドは機能しません(メソッドを実行するときに_initializeメソッドを先に実行しません)、コードを見てください.
また、継承する場合、親にコンストラクション関数がある場合、子クラスはそのコンストラクション関数で一般的に親クラスのコンストラクション関数を初期化し、コードの元の性と完全性を確保します.
2)コンストラクション関数は書き換えられていません.つまり、定義したコントローラにコンストラクション関数は宣言されていません.
この場合、コントローラに定義がある場合_Initialize()メソッドでは、他のメソッドを呼び出すと、先に_が呼び出されます.initialize()メソッド、コードを参照:
また、_initialize()は継承にも使用できます
では、同時に存在します_construct()と_Initialize()は、いったいどれを先に実行するのでしょうか.
答えは--先に実行する_initialize()メソッド、すなわち、条件を満たす場合、initialize()関数は、構造関数を含む任意の方法で実行される前に実行されます.
もちろん、実行するメソッドで別のメソッドまたは複数のメソッドを呼び出した場合、_Initialize()メソッドはもう実行されません.それはあなたが初めて呼び出したメソッドに関連しています.つまり、メソッドの中で何をしているのか、それは管理できません.
よし、以上は個人的な見解ですが、不適切な点があれば、訂正を歓迎します!!!
ネット上で多くの言い方と使い方があって、自分でテストして、以下はテストの结果によってそして自分の理解を结び付けて出した结论で、もし间违った地方があるならば、みんなを歓迎して直します!!!
まずThinkphpが持っているControlleクラスの内容(ThinkPHPLibraryThinkController.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();
}
Controllerクラスのコンストラクション関数から分かるように、このコンストラクション関数はオブジェクトに_があるかどうかを判断します.initializeメソッド、ある場合は先_を実行Initializeメソッド
そのため、自分で定義したコントローラでは
1):書き換え構造関数があります.
①書き換え構造に親を実現するコンストラクション関数(parent::construct()),
コントローラに定義がある場合_Initialize()メソッドでは、コントローラのメソッドを呼び出すときに_を実行します.initialize()メソッドを実行し、コードを参照してください.
';
}
public function _initialize() {
echo '
';
// parent::_initialize();
}
public function index(){
self::b();
echo ' index';
}
public function b() {
echo 'bbbb
';
}
}
/*
index , :
bbbb
bbbb
index
*/
②:書き換えた構造に親のコンストラクタが実装されていない場合、メソッドを実行するときに定義される_Initialize()メソッドは機能しません(メソッドを実行するときに_initializeメソッドを先に実行しません)、コードを見てください.
';
}
public function _initialize() {
echo '
';
// parent::_initialize();
}
public function index(){
self::b();
echo ' index';
}
public function b() {
echo 'bbbb
';
}
}
/*
index , :
bbbb
bbbb
index
*/
注:この中の先実行_initialize()メソッドはparent:_construct();前に関数呼び出しはありません.parent::_construct();前のself::b()、それは言うまでもなく、b()を先に実行したに違いないが、一般的にはそうは書かず、親クラスのコンストラクション関数を実現する前に出力も構成もない.また、継承する場合、親にコンストラクション関数がある場合、子クラスはそのコンストラクション関数で一般的に親クラスのコンストラクション関数を初期化し、コードの元の性と完全性を確保します.
2)コンストラクション関数は書き換えられていません.つまり、定義したコントローラにコンストラクション関数は宣言されていません.
この場合、コントローラに定義がある場合_Initialize()メソッドでは、他のメソッドを呼び出すと、先に_が呼び出されます.initialize()メソッド、コードを参照:
';
// }
public function _initialize() {
echo '
';
// parent::_initialize();
}
public function index(){
self::b();
echo ' index';
}
public function b() {
echo 'bbbb
';
}
}
/*
index , :
bbbb
index
*/
また、_initialize()は継承にも使用できます
';
}
public function _initialize() {
echo '
';
}
public function a() {
echo 'aaaa
';
}
}
';
}
public function _initialize() {
parent::_initialize();
echo '
';
}
public function index(){
self::b();
echo ' index';
}
public function b() {
echo 'bbbb
';
}
}
/*
index , :
bbbb
bbbb
index
*/
注意:親クラスのコンストラクション関数にparent::construct()がない場合、定義された_initialize()も効かないでは、同時に存在します_construct()と_Initialize()は、いったいどれを先に実行するのでしょうか.
答えは--先に実行する_initialize()メソッド、すなわち、条件を満たす場合、initialize()関数は、構造関数を含む任意の方法で実行される前に実行されます.
もちろん、実行するメソッドで別のメソッドまたは複数のメソッドを呼び出した場合、_Initialize()メソッドはもう実行されません.それはあなたが初めて呼び出したメソッドに関連しています.つまり、メソッドの中で何をしているのか、それは管理できません.
よし、以上は個人的な見解ですが、不適切な点があれば、訂正を歓迎します!!!