0

私の問題は、REQクラスがユーザーのget()メソッドではなくREQ_Userのget()メソッドを呼び出すことです。

REQクラスにREQ_Userのget()メソッドを呼び出させることは可能ですか?それとも、これは悪いOOP設計ですか?私ができるより良いOOPデザインはありますか?

REQは、一般的なルートを処理するメインルーターです。

abstract class REQ{
    function get(){die('get() is not available');}
    function get_id($id){die('get_id() is not available');}
    function __construct(){
        http_response_code(500);//We dont know if its gonna be an unknown error in the future.
        if($_SERVER['REQUEST_METHOD']==='GET' && isset($_GET['id']))
            $this->get_id( (int)$_GET['id'] );
        elseif( $_SERVER['REQUEST_METHOD']==='GET' )
            //Heres is the actual problem of my question.
            //This will call the youngest child class which is user's get() method.
            //I need it to call the REQ_User's get() method instead.
            $this->get();

        //Much more routes is supposed to be here like post,delete,put etc. But this is just a example.
    }
}

REQ_Userは、REQよりも多くの機能を追加します。ユーザーマネージャークラス専用の機能。

abstract class REQ_User extends REQ{
    function session(){die('session() is not available');}
    function get(){//I need this method to be called instead of user's get() method.
        if(isset($_GET['session'])){
            $this->session();
        }else{//Call either its parent or its child but never its self.
            if(get_class($this) === __CLASS__) parent::get();
            else $this->get();
        }
    }
}

REQ_Commentは、REQよりも多くの機能を追加します。コメントマネージャークラスのみに特化した能力。

abstract class REQ_Comment extends REQ{
    function byuser($id){die('byuser() is not available');}
    function get(){
        if(isset($_GET['byuser'])) $this->byuser( (int)$_GET['id'] );
        else{//Call either its parent or its child but never its self.
            if(get_class($this) === __CLASS__) parent::get();
            else $this->get();
        }
    }
}

* get()は自分自身を呼び出さず、子がメソッドget()を取得したかどうかに依存するのは、その親または子のみであることに注意してください。

実際のロジックはこれらのクラスに含まれます。トップクラス。これらのクラスは非常に専門的です。

class user extends REQ_User{
    //If no url parameter is set then this will get a collection of users.
    function get(){
        http_response_code(200);
        die('user1,user2...');
    }
    function session(){
        http_response_code(200);
        session_start();
        die(json_encode($_SESSION['user']));
    }
};
class comment extends REQ_Comment{
    function byuser($id){//Specialized route only for comments based classes.
        http_response_code(200);
        die('comment1,comment2... by user '.$id);
    }
    function get_id($id){//This comes directly from REQ class.
        http_response_code(200);
        die('user '.$id);
    }
};

//new comment();
//new user();
4

1 に答える 1

1

両方を呼び出す必要がある場合は、メソッドparent::get()内から呼び出します。それ以外の場合は、メソッドに別の名前を付ける必要があります。getuseruser

オブジェクト指向の設計について: コードの目的はわかりませんが、この質問をしなければならないという事実だけでも、設計が悪いことを示唆しています。また、おそらく継承の間違った使い方、責任の混合、不明確な命名...

$_GET['session'] が設定されていない場合 (メソッドが自分自身を呼び出している場合)、無限再帰が発生します。

function get(){
    echo 'REQ_user method';
    if(isset($_GET['session'])){
        $this->session();
    }else{
        $this->get();
    }
于 2013-02-16T19:09:50.020 に答える