Kenichi Ando(Neo,Inc)
ando****@neo-n*****
2007年 12月 5日 (水) 22:14:21 JST
bossatamaです。 再度コンストラクタについて。 実は大きなことのわりには、マニュアルでの扱いは、 http://userguide.cilab.info/general/controllers.html#constructors かなり下にその説明が方に書かれています。 ところが、本家のブログを作るチュートリアルでもコンストラクタ を使っています。 http://codeigniter.biz/archives/22 初心者はコンストラクタなど使用しないでもサクサクCIが使えて しまう上に、最初の理解の障壁となるかもしれません。 また、PHP4ではコンストラクタの書き方が異なってしまうのも 面倒でしょうか。 PHP5では以下の両方で動作します。 function __construct() { parent::Controller(); } function Blog() { parent::Controller(); } で、一体何が言いたいのかというと、下記に戻ってしまいます。 CakePHPでは、__construct()にコンストラクタを統一し、PHP4でも 擬似的に動作するようです。 > 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();をしないケースは親を無視します。 > このケースはどういった使い方があるのか?と思います。 //bossatama