为了学习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倍。
答案 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