2012-02-17 6 views
0

私は自分のシンプルなMVCフレームワークをビルドしようとしています。主に教育目的のために、これまでのCodeIgniterを使って、フレームワークに取り入れる機能のインスピレーションの大半を提供しました。CodeIgnitersの動的ロードクラスはどのように機能しますか?

私はCodeIgnitersのようなローダークラスを構築したいと思いますが、彼らは理にかなって呼び出し元のクラスすなわち

class Random_Controller{ 

    function __construct(){ 
    $this->load->helper('some_class'); 
    $this->some_class->do_something(); 
    /* 
    How does CI load some_class as if it were a property of Random_Controller? 
    I can understand using something like $$class_name = new $class_name(); 
    Or $$this->class_name = new $class_name(); 
    But how can the dynamically named object be used with $this->? 
    */ 
    } 
} 

うまくいけばのプロパティであるかのように、私はCIのクラスをロードする方法を理解することはできません...

私は、正しい説明でどのように単純なものが表示されるかに常に驚いています。しかしもう1つの質問。

$ loadがロードクラスのインスタンスへの参照であり、ロードされたすべてのクラスのレコードが配列内に保持されている場合、基本的には次のようになります: $ this-> loaded_classes [$ key] - > do_something ?

したがって、CIは配列を変数名に解決しますか?私は変数が存在しないかメソッドが存在しないときに呼び出されるいくつかのPHPマジックメソッドを見てきましたが、これはこれらの魔法のメソッドと組み合わせて行われるのでしょうか?つまり、$ this-> some_classプロパティが存在しない場合、そのキーを持つ配列内の要素を検索しますか?

それは...

+1

あなたは実際に実装を見て気にしましたか?いいえ?それから、あなたがそれについて理解していない特定の事柄であなたの質問を更新してください。 – Gordon

+0

私は実装を見てはい、私の質問は '$ this->'経由で変数オブジェクトにアクセスする方法でした。私は解決策を見つけました。変数オブジェクトは変数名への参照によって代入される必要があります。&newはPHP 5で非推奨の警告を生成します。解決策は$ this-> $ class_name =&$ temp_classでした。 $ this-> dynamic_name-> do_something(); – 4D1

答えて

1

オム理にかなっている場合は、さて、これで起動してみましょう:CI_Controllerスーパークラス。これはすべてのコントローラが拡張しているもので、これが参照するすべての$スーパーオブジェクトとして機能します。

CI_Controllerがシングルトンとして機能し、初期化時に、それはオートローダとして働く(あなたがコア/ common.phpの中に見つけることができます)load_class()、関数を呼び出します:静的な配列($ _Classes)の内側には、インデックスとしてassignesクラス名、及び値としてクラスインスタンス:

$_classes[$class] = new $name(); 

そして(同じファイル内)コンパニオンis_loaded()関数は、すべての機能がロードされ、アレイ内のレジスタ、およびクラスが既にあった場合、後で確認するために使用されインスタンス化されているかどうか。次に、他のすべてのリソースをロードするためresponsibileある、

Ci_Controllerが$負荷プロパティに次に(上記の機構を使用して、コア/ loader.php)Loaderクラスのインスタンスを割り当て

$this->load =& load_class('Loader', 'core'); 

helper()、library()、model()などの独自のメソッドを使用します。 、すべての詳細については、ソースを見て、あなたのコメントごとに明確にするために

かかわらず、画像を得た願っています:

$load = new Loader(); 
$load->helper('helper'); 

は同じのようになります。

$this->load->helper('helper')

$this->loadには、Loaderクラスのインスタンス(参照)が含まれているためです。 次に、Loaderクラスのhelper()、library()などのメソッドがあまりにも多く書いてあり、Loader.phpファイルを開いて自分で見ることができます。

+0

返事ありがとうDamien、別の質問を追加する場所がわからなかったので、上記の投稿を編集しました。また、私はあなたの答えを投票しただろうが、明らかに私は少なくとも15の担当者が必要です。 – 4D1

+0

+1優れたレスポンス! –

関連する問題