2011-01-05 3 views
2

Codeigniterでは、コントローラーに$this->load('class_name')を使用すると、CIはそのコンストラクターを使用してクラス/モデルのインスタンスを作成しようとします。

しかし、私は実際にはそのクラスのインスタンスを必要としません。静的な関数を呼び出すだけです。また、$this->load('class_name')には大きな制限があります。私は、CIのコアクラスを拡張または変更しない限り、コンストラクタにパラメータを渡すことはできません。

私は$this->load('class_name')関数は私のためにクラスphpファイルのrequire_onceを実行し、コントローラのクラスで自由に(インスタンスの作成/静的関数の呼び出し)できるようにしてください。

この関数を無視して、require_onceを使用するか、独自の__autoload関数を作成してクラスをロードする必要がありますか?この方法では、CIボックス内にコードを記述していないように見えるので、私は奇妙に感じます。

+0

ハ、あなたはそれを打ちました!私はそれをロードしたときにモデルのコンストラクタが呼び出されているように思えたのですが、それは呼び出されていました。それはちょっと変だ。 –

答えて

1

コンストラクタにパラメータを渡すことができます。 「クラスを初期化するときにパラメータを渡す」セクションin the user guideを参照してください。

1

CodeIgniterのオブジェクトの作成と読み込みが非常に制限されています。私は自分のコードを完全に制御し、バックグラウンドではほとんど魔法を使わない。代わりにDoctrine's Class Loaderを使用し始めました。非常に軽量で、本質的にはSPL autoloadingです(これも良い選択肢です)。あなたは、ORMとそのすべてのもので、ClassLoaderだけでDoctrineシバン全体を必要としません。この権利を得るにはいくつかの設定がありますが、それは不思議なことです。

PHP 5.3では、アプリケーションディレクトリに名前空間のクラスがあります。たとえば、私は、テストディレクトリに新しいクラスを作成しました:私は私のコード(コントローラ、ビューでこのクラスを使用することになり

namespace Tests; 

class SomeTest { 
    ... 
} 

:SomeTest.php

ことをテスト\アプリケーション\テストは、次のようなものを見ることができます、ヘルパー)を使用するだけで、私のコード(use \Tests\SomeTest as SomeTest)の上に完全な名前空間(すなわち$test = new \Tests\SomeTest)または "use"ステートメントを使用することができます。

このようにして、すべてのライブラリとモデルをOOの名前空間を持つバリアントに置き換えようと考えています。これには多くの利点があります:SPLによる高速オートロード、クラス/メソッドに対する完全なIDEインテリセンスのサポート(CodeIgniterは本当に悪いです)、あなたのコードは他のフレームワークやプロジェクトに移植性があります。

しかし、私はまだ多くのCodeIgniterエンジンを使用しています。これは基本的に私のクラスのほとんどに$CI =& get_instance()があることを意味します。それはまだ進行中の作業であり、私はCIが必要な主な理由は、データベースへのアクセスだと思う。そのことを考慮して、Dependency Injectionのようなものを使用すれば、私はクラスにCodeIgniterをまったく必要としません。私はMVCフレームワークのためだけにそれを使用し、時には私のコントローラーのメソッドを使用します。

私はこれがあなたの質問を超えていることは知っていますが、うまくいけばそれは食べ物です。

関連する問題