2

我正在尝试向面向对象的 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;似乎不起作用!

另外,您还可以提出其他改进建议吗?我是新手!

4

3 回答 3

3

您应该将对象传递给新对象。

$controller = new $controller_name($this);

//...

class controller_blog
{   
    public function __construct($router)
    {
        echo $router->action;
    }
}
于 2013-11-01T14:15:29.860 回答
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;
    }
}

- 因为你没有指定你的结构,你需要自己决定什么更正确。

于 2013-11-01T14:22:44.653 回答
0

将变量从 传递controller_router到 ,controller_blog作为 的构造函数的参数controller_blog

于 2013-11-01T14:16:37.867 回答