2016-05-27 9 views
0

MVC を学ぶ目的で(私は全く新しいです)私は自分のミニフレームワークを作成しています。おそらく私の質問はかなりばかげているかもしれませんが、いくつかの点では明らかですが、私は実際にGoogleにすることはできませんでした。また、長く冗長な投稿をして申し訳ありません。PHP MVCでモデルに対応する名前を生成

私のRouterクラスはこのように動作しますwww.example.com/controller/controller_method

私のすべてのコントローラとモデルは、名前に同じプレフィックスが付いています。たとえば、私はUsersControllerクラスとそれに対応するUsersModelクラスを持っています。

コントローラとモデルは、対応する抽象クラスのインスタンスです。たとえばコントローラクラスは次のとおりです。

abstract class Controller 
{ 
    protected $model; 

    public function __construct(Model $model) 
    { 
     $this->model = $model; 
    } 
} 

ここで質問します。私は、コントローラのコンストラクタ内で、このように対応するモデルをインスタンス化しています:

class UsersController extends Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(new UsersModel()); 
    } 
} 

しかし、このようにそれを行うには右/許容/十分な次のようになります。

class UsersController extends Controller 
{ 
    public function __construct() 
    { 
     $model = str_replace("Controller", "Model", __CLASS__); 
     parent::__construct(new $model()); 
    } 
} 

かであってもよく、さらに良いことに、このような:

abstract class Controller 
{ 
    protected $model; 

    public function __construct($classname) 
    { 
     $model = str_replace("Controller", "Model", $classname); 
     $this->model = new $model(); 
    } 
} 

だから、子供のコンストラクタは次のようになります。

public function __construct() 
{ 
    parent::__construct(__CLASS__); 
} 

これは自動化されているようですが、おそらく、貧弱/低速/愚かなデザインの決定である可能性がありますか?私が心配している主な理由は、__CLASS__定数が魔法であることです。私は、魔法の方法/定数が2-24倍遅くなる可能性があると読んでいます。

答えて

1

子クラスでは約大騒ぎする必要はありませんが:

abstract class Controller 
{ 
    protected $model; 

    public function __construct() 
    { 
     $modelName = str_replace("Controller", "Model", get_class($this)); 
     $this->model = new $modelName; 
    } 
} 

この質問への回答秒の礼儀:Getting the name of a child class in the parent class (static context)

注意:PHP 5.2.9

が必要です
関連する問題