codeigniterでloadするとrequireが必要ないのはなぜか。

投稿者: | 2018/03/07

CodeIgniter3では例えばControllerクラスを作るときコンストラクタなどで

class controller_name extends CI_Controller{
	public function __construct(){
		parent::__construct();
		$this->load->model('model_name');
	}
}

としてモデルクラスを読み込むのだがこのときrequire_onceを呼び出す必要がありません。
なんでかな~っとずっと思っていたのでちょっと調べました。
結論から言えばたいしたことではなく$this->loadはsystem/core/Loader.phpのLoaderクラスで、
例えばmodelメソッドでは、読み込んだことがあるかチェックして読み込んだことがなければ、
require_onceを呼び出し、controllerにモデルのプロパティを追加しています。

Modelクラスもhelperを読み込むとき同じようなコードだから同じような構造かと思えば違った!

class model_name extends CI_Model{
	public function __construct(){
		parent::__construct();
		$this->load->helper('helper_name');	// ←これはCI_Modelのloadプロパティではない!
	}
}

モデルの基底クラス。(抜粋)

class CI_Model {
	…
	public function __get($key)
	{
		return get_instance()->$key;	// get_instance()はCI_Controllerを呼び出す。
	}
}

どうやらCI_Modelで定義されていないプロパティを呼び出された場合はCI_Controllerのプロパティを代わりに呼び出すらしい。
ちょっと直感的ではない、っていうかCI_Modelは何もしてないじゃん!結局コントローラと同じインスタンスのLoaderが呼び出されてました。

このloadプロパティはちょっと微妙でコードの中ではrequire_onceで読み込んでいるところとload->xxxx()で読み込んでいるところができちゃって困ることがある。(このフレームワーク内ですべてが収まればいいんですがそうでもないので。)
Controllerのメソッドごとに必要なものをロードしていると管理が大変なのでコンストラクタで読み込むのが基本ですが全然メリットが活かせてないんですよね。


コメントを残す

メールアドレスが公開されることはありません。