ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    CodeIgniterのモデルから、他のモデルを呼び出す方法

    このエントリーを含むはてなブックマーク はてなブックマーク - CodeIgniterのモデルから、他のモデルを呼び出す方法 あとで読む
    備忘録としてメモ。

    CodeIgniterのモデルから、他のモデルを呼び出して使う方法。
    モデルから他のモデルを読む :: みやびぶろぐ
    「CodeIgniterの別のモデルの中からモデルへのアクセスはできますか?」 - うずら技術メモ

    class SomeModel extends Model
    {
     function doSomething($foo)
     {
      $CI =& get_instance();
      $CI->load->model('SomeOtherModel','NiceName',true);
      // use $CI instead of $this to query the other models
      $CI->NiceName->doSomethingElse();
     }
    }



    $this->model_name->method();
    の代わりに、
    $CI->model_name->method();
    を使えばOK

    ●get_instance();
    補足説明。
    get_instance();は、何をやっているのか?

    コアクラス CI_controller | 実践編 CodeIgniter Guide 徹底ガイド!

    CI_Controllerクラスインスタンス取得

     「CI_Controller」及び「CI_Model」基底クラスを継承(オーバーライド)したクラスは、 各コアクラスインスタンスをプロパティ変数を用いることで利用できるのですが、 コントローラとモデル以外のライブラリクラスやヘルパークラスなどからは プロパティ変数を利用してコアクラスのインスタンスにアクセスできません。

     ライブラリクラスやヘルパークラスからコアクラスのインスタンスを利用するには、 「CI_Controller」クラスのインスタンスを取得する必要があります。
     取得した「CI_Controller」インスタンスからコアクラスのインスタンスが利用できるようになります。

    CI_Controller::get_instance()

     「CI_Controller」クラスのスタティックメソッド「get_instance()」を実行すると、「CI_Controller」
    クラスのインスタンスが取得できます。
    「get_instance()」メソッドは、シングルトンと呼ばれるデザインパターンの手法で、「CI_Controller」 のインスタンスを返します。
     つまり、何度「get_instance()」を実行しても複数の「CI_Controller」インスタンスが作成されることは無く、 常に同じインスタンスを取得することができます。

    $CI = CI_Controller::get_instance();

    または、「CodeIgniter.php」で定義されている「CI_Controller::get_instance()」のラッパー関数からも
    取得できます。
    $CI =& get_instance();

    CI_Controllerインスタンスの利用
    $CI->config->load('my_config');




    ●シングルトンパターン
    Singleton パターン - Wikipedia

    Singleton パターンを用いると、そのクラスのインスタンスが1つしか生成されないことを保証することができる。
    ロケールやLook&Feelなど、絶対にアプリケーション全体で統一しなければならない仕組みの実装に使用される。




    シングルトンパターンの誘惑に負けない - Strategic Choice

    シングルトンパターンは多くの問題の解決に役立つパターンです。

    このパターンでは、クラスのインスタンスは必ず1つしか生成されません。そのインスタンスは使用前に必ず初期化されます。そしてシングルトンをグローバルアクセスポイントとすることで、設計をシンプルにできます。

    シングルトンパターンは魅力的なのですが、実は、利点よりも弊害の方が多いパターンです。

    テストの妨げになります。保守性も悪くなります。残念ながら、その事実は広く知られていないため、多くのプログラマを惹きつけています。つい使いたい誘惑にかられますが、強く抵抗しなくてはなりません。




    PHPで使うGoFパターン ひとり Advent Calendar - シングルトン - Qiita [キータ]

    シングルトンってなに?

    要するに割と安全なグローバル変数です。

    ポイントは以下
    ・コンストラクタを private にする
    ・自身を保持するprivate static な変数を作る
    ・自身を返すpublic static なメソッドを作る


    実は単体テストで癌になり易いです。

    ・普通には new 出来ない
    ・メソッド内で気軽に直接参照され易い
    等の問題があります。

    結局、単体テストのために
    ・引数でオブジェクトを渡すように修正
    ・コンストラクタをpublic に書き換える
    など、無惨な末路を辿る結果になります。

    ご利用は計画的に




    シングルトンが邪悪な理由 - まつぼ x Web

    4) Singletonは状態を持ち続ける

    永続性は単体テストの敵。テストを効率的に行うことは、1つ1つが独立していなければならない。そうで無ければテストが他のオブジェクトに影響されてしまう。

    これは、別の場所の影響でテストが失敗してしまう可能性がある。テストは1つを明確にテスト出来ればよい。そうでなければ、バグが埋め込まれるリスクがタカミスター宇。

    静的な変数を無くすためには、テスト毎に状態変数を持たないようにすべき。Singletonは静的変数を必要としてしまう。Singletonを使わないことは、テストドリブンな開発への基本である。




    シングルトンには、メリットとデメリットがある。
    $CI =& get_instance(); の使用も、必要最小限にとどめたい。


    PHPによるデザインパターン入門
    下岡 秀幸
    秀和システム
    2006-11
    3150円


    PHPによるデザインパターン入門 - Do You PHP?

    PHPによるデザインパターン入門 - 下岡秀幸, 畑勝也, 道端良 - Google ブックス

    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/958-4354b653

    FC2Ad