最近ThinkPHPフレームワークを勉強していて、_initialize()関数を見かけたので簡単にまとめてみました
GoogleとBaiduのチュートリアルをざっと見たのですが、かなり話がまとまっていると感じました、それらはすべてテストされていましたが、要点までは到達できませんでした ~
実験版: ThinkPHP 3.2.3、PHP5.6。
_initialize() 関数は、親クラスとサブクラスのコンストラクターをサブクラスで同時に呼び出すことができるようにするために登場します。
それを理解する最も簡単な方法は、最も信頼できる TP のソース コードを開くことです。
パス: ThinkPHP3.2.3/ThinkPHP/Library/Think/Controller.class.php (△Controllerは抽象クラス△)
ここで、抽象クラスControllerが__construct()メソッドに書き換えられていることがわかります。 3 つの赤い線に注目してください。ここには _initialize() がすべてあります。実際、 _initialize() メソッドの特別な宣言はなく、それに特別な関数を与えます。
_initialize() がコンストラクターの機能を持っていることがわかります。これは単に __construct() 内にあるためです (クラスがインスタンス化されると、コンストラクター __construct が実行されます。現在のクラスに _initialize() メソッドがある場合、ちなみに_initialize())を実行しました
ネイティブPHPでサブクラスと親クラスのコンストラクターを同時に呼び出すという要件を完了する方法を見てみましょう。
それでは、ThinkPHP ではどうなるでしょうか?
ネイティブ コードが要件を満たしたい場合は、サブクラスでparent::__construct()を呼び出して実行する必要があります。
ThinkPHP では、親クラスが特別に処理された後で _initialize() 自体がこの関数を完了できます。実際、ThinkPHP の _initialize 関数は、親クラスと子クラスのコンストラクターを同時に呼び出す必要がある場合に使用することを目的としていると思います。時間。 。
TPで_initialize()と__construct()を使用する際の注意点をまとめると
_initialize()と__construct()が同時に現れた場合、このとき__construct()なので_initialize()は無効になります。は書き直され、_initialize() を呼び出さなくなりました。
親クラスと子クラスのコンストラクターを同時に呼び出す必要がある場合は、親クラスの __construct() で処理する必要があります:
<code>if(method_exists($this,’_initialize’)){ $this -> _initialize(); } </code>
両方とも、そうしないと、親クラスと子クラスの関数が同時に呼び出されることになります
今のところ (ThinkPHP3.2.3)、結局のところ、_initialize() はまだ行う必要があります。この場合、 _initialize() の役割は名前付け制約だけです。必要に応じて、公式がこの機能を改善すると思います。