1

MVC アプリケーションを作成しています。ローダークラスでこの関数を作成しました:

public function load_models($model)
{
    if ($model) {
        set_include_path($this->modelDirectoryPath);
        spl_autoload_extensions('.php');
        spl_autoload($model);   
    }
}    

次のように、コントローラーからこの関数を使用しています。

$this->load->load_models('news');

このモデル クラスに次のようにアクセスします。

$this->load->news->get_article();

しかし、私はこれをしない限りできません:

$this->load->news = new news();
$this->load->news->get_article();

入力せずにアクセスしたい$this->load->news = new news();。また、それを自動的にインスタンス化したいと考えています。誰でも助けることができますか?

4

2 に答える 2

1

get_article() を静的メソッドにして、次のようにアクセスします。

$this->load->news::get_article();

クラスのインスタンスを少なくとも 1 つインスタンス化しないと、非静的メソッドにアクセスできません。リフレクションがあっても、実際には通常のメソッドを呼び出すことはできません。

次のようなプロパティにアクセスするときに、ロードクラスにマジック メソッドを実装できます。

$this->load->news->get_article();

「ニュース」プロパティの名前がクラス名にもロードされているかどうかを確認し、ロードされているがクラスのインスタンスに設定されていない場合は、インスタンスを作成してそれに割り当てます。

これは魔法の方法です:

public function __get(){ ... } ; 

基本的に、この魔法のメソッドは、オブジェクトの ... アクセスできないプロパティ (宣言または作成されていないもの) にアクセスするたびに、常に呼び出されます。

于 2012-06-18T21:10:49.797 に答える
1

あなたはCodeIgniterの何かを「チャネリング」しているようですが、これは非常に時代遅れです(詳細を知りたい場合は、PHPチャットルームにアクセスしてください)。高品質のコードが必要な場合、これはエミュレートするフレームワークではありません。

ああ、実装しているパターンは実際には MVC ではなく MVP です。違いがあります。

  • 最初は、実際に動作する make autoloaderを実行する必要があります。spl_autoload_register().. それがどのように使用され、実際に何をするかについて読んでください。コメントで提供されているものに加えて、いくつかの例が必要な場合は、PSR-0 の実装を調べることができます。実際にどのように使用するか、いくつかのアイデアが得られるはずです。

    これにより、基本的$this->load->load_models('news');にコントローラーの行が削除されます。

  • MVC では、モデルはオブジェクト/クラスではなくレイヤーです。私は歌とダンス全体を繰り返すつもりはありません.私はこれについてしばらく前に答えを書きました..それは長いです=/

  • コントローラー内で使用するべきではありませんnewが、あなたが考えるのと同じ理由ではありません。newクラスの名前に密結合を引き起こすため、避ける必要があります。代わりに、ControllerインスタンスにFactoryin コンストラクターを提供する必要があります。

    $factory = new DomainFactory( new PDO(...), $cache );
    $controller = new Foobar( $factory );
    
    $controller->$command($request);
    

    これは、次のようにコントローラーメソッドで使用できます。

    public function __construct( $domain_factory )
    {
        $this->factory = $domain_factory
    }
    
    public function do_stuff( $request )
    {
        $id = $request->getQuery('id');
        $articles = $this->factory->build('news')->get_article($id);
        // thought i would split this line into two parts
    }
    

    ああ..そして、工場が何をするか、これは次のようになります:

    public function __construct( $pdo, $cache )
    {
        $this->pdo = $pdo;
        $this->cache = $cache;
    }
    
    public function build( $name )
    {
        $instance = new $name;
        $instance->assign_connection( $this->pdo );
        $instance->assign_cache( $this->cache );
        return $instance;
    }
    

これはあなたにいくつかのアイデアを与えるはずです..

ベスト プラクティスに従う優れたオブジェクト指向コードの作成方法を学びたい場合に役立つリンクをいくつか紹介します。

于 2012-06-18T21:47:59.310 に答える