我正试图跳向面向对象的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;
似乎不起作用!
此外,您可以建议的任何其他改进?我是新手!
答案 0 :(得分:3)
您应该将对象传递给新对象。
$controller = new $controller_name($this);
//...
class controller_blog
{
public function __construct($router)
{
echo $router->action;
}
}
答案 1 :(得分:1)
在代码中有几种方法可以做到 - 但首先你需要记住 。这意味着 - 你需要意识到,你的应用程序的结构是什么。每个实体有什么结构?每个实体如何在课堂上实施?实体如何相关以及如何在代码中实现?
例如,其中一个选项可以从父类继承您的操作。但首先,您需要让controller_blog
controller_router
孩子成为class controller_blog extends controller_router
{
public function __construct()
{
echo $this->action;
}
}
。这可能有意义 - 但它们是否以这种方式相关 - 取决于你自己决定。你可以这样做:
class controller_blog
{
public $action;
public function __construct(controller_router $router)
{
$this->action = $router->action;
}
}
- 你将有一个课程将扩展另一个课程。
但他们可能不是这样相关的吗?然后,您需要将依赖项注入您的博客控制器。例如
{{1}}
- 既然你没有指明你的结构,你需要自己决定什么更正确。
答案 2 :(得分:0)
将controller_router
中的变量作为controller_blog
的构造函数的参数传递给controller_blog
。