在PHP MVC中为模型生成相应的名称

时间:2016-05-27 22:52:16

标签: php oop model-view-controller installation

为了学习MVC (我对此我是全新的)我正在编写一个自己的迷你框架。也许我的问题将是相当愚蠢的,对于一些人来说,显而易见,但我真的不能谷歌,主要是因为我不知道如何google它。此外,对于冗长冗余的帖子感到抱歉。

我的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 个答案:

答案 0 :(得分: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