[Codeigniter-users] コントローラーのコンストラクタについて

Back to archive index

Kenichi Ando(Neo,Inc) ando****@neo-n*****
2007年 11月 26日 (月) 23:39:54 JST


bossatamaです。

コントローラーのコンストラクタについて考えを標準化しようと
思います。

通常は
<?php
class Blog extends Controller {

	function index()
	{
		echo 'Hello World!';
	}
}
?>

のindexで動きます。
URIは、
www.hoge.com/index.php/blog/
または、www.hoge.com/index.php/blog/index
となります。

コンストラクタを使うと、

<?php
class Blog extends Controller {

	function Blog()
	{
		parent::Controller();
	}

	function index()
	{
		echo 'Hello World!';
	}
}
?>

コンストラクタ(今回はPHP4で)は、
オブジェクトの生成時に自動的にコールされる特殊なメンバ関数。

CIマニュアルでは、ローカルなコンストラクタは、親コントローラクラスの
コンストラクタを上書きしてしまうので、手動で親コントローラクラスの
コンストラクタを呼び出す必要がある。(parent::Controller();)

とあります。また、

コンストラクタはインスタンス化されるときに、初期値をセットする必要が
ある場合や既定の処理を実行する場合に便利です。コンストラクタは値を返す
ことができませんが、既定の処理を実行することができます。

とあります。

bossatama的見解では、ローカルコンストラクタでは、parent::Controller();
は宣言するのもはもちろん、ヘルパー関数やDBのロード宣言をここで行う。
index()だけでは済まない大きめのプログラムを作る場合、特に、同じファイル
内で、共通して使用するものがある場合は、ローカルコンストラクタを必ず定義
した方がいいと思います。

ローカルContorllerクラスの親クラスは、libraries/Controller.phpにいます。
コントローラークラスはCI_Baseの子クラスです。
CI_Baseはcodeigniter/Base4.php(for PHP4)にいます。
CI_Baseは、CI_Loaderの子クラスです。
CI_Loaderはlibraries/Loader.phpにいます。
オーバーライドしまくりです。


ローカルなコンストラクタは親をオーバーライドするので、
parent::Controller();をしないケースは親を無視します。
このケースはどういった使い方があるのか?と思います。
=========================================
CodeIgniter Users Group in Japan
bossatama
http://codeigniter.jp/
=========================================




Codeigniter-users メーリングリストの案内
Back to archive index