2

オブジェクト指向のphpに飛び込もうとしています。私は自分自身の MVC フレームワークをゼロから構築しています。なぜなら、私は完全に制御したいからであり、それは良い学習練習になると考えているからです。

これは、名前に応じて異なるフォルダーにルーティングするために使用するルーターです (インデックス ファイルにオートローダー機能があります)。

class controller_router
{
    public $controller;
    public $action;
    public $id;
    public $freetext;

    //set the url path variables
    public function __construct($controller,$action,$id,$freetext)
    {
        $this->controller = $controller;
        $this->action = $action;
        $this->id = $id;
        $this->freetext = $freetext;
    }

    //instantiate the main controller according to url
    public function instantiateMainController()
    {
        $controller_name = 'controller_'.$this->controller;
        $controller = new $controller_name;
    }
}

私のブログコントローラーは次のようになります (アクションを取得できるかどうかをテストするだけです):

class controller_blog
{   
    public function __construct()
    {
        echo $this->action;
    }
}

私の質問は、親 (ルーター) からアクション変数を取得するにはどうすればよいですか?

コマンドecho $this->action;が機能していないようです。

また、あなたが提案できる他の改善点はありますか?私は初心者です!

4

3 に答える 3

3

オブジェクトを新しいオブジェクトに渡す必要があります。

$controller = new $controller_name($this);

//...

class controller_blog
{   
    public function __construct($router)
    {
        echo $router->action;
    }
}
于 2013-11-01T14:15:29.860 に答える
1

コードでこれを行う方法はいくつかありますが、最初にそれを念頭に置く必要があります。つまり、アプリケーションの構造を理解する必要があります。各エンティティにはどのような構造がありますか? 各エンティティはクラスでどのように実装されていますか? エンティティはどのように関連しており、それはコードでどのように実装されていますか?

たとえば、オプションの 1 つは、親クラスからアクションを継承することができます。controller_blogしかし、最初に の子を作成する必要がありますcontroller_router。これは理にかなっているかもしれませんが、それらがそのように関連しているかどうかは、あなた次第です。これは次の方法で実行できます。

class controller_blog extends controller_router
{   
    public function __construct()
    {
        echo $this->action;
    }
}

-したがって、別のクラスを拡張する 1 つのクラスができます。

しかし、彼らはそのように関連していないのでしょうか?次に、ブログ コントローラーに依存関係を挿入する必要があります。例えば

class controller_blog
{   
    public $action;

    public function __construct(controller_router $router)
    {
        $this->action = $router->action;
    }
}

-構造を指定していないため、より正しいものを自分で決定する必要があります。

于 2013-11-01T14:22:44.653 に答える
0

のコンストラクタの引数として、controller_routerから に変数を渡します。controller_blogcontroller_blog

于 2013-11-01T14:16:37.867 に答える