找不到课程

时间:2016-11-06 02:20:22

标签: php include

我试图用PHP编写前端控制器。

这是我的代码:

<?php

require_once('Controller/LoginController.php');
require_once('View/LoginView.php');
require_once('Model/UserModel.php');

class FrontController
{
    private $controller;
    private $view;

    public function __construct(Router $router, $routeName, $action = null)
    {
        $route = $router->getRoute($routeName);

        $modelName = $route->model;
        $controllerName = $route->controller;
        $viewName = $route->view;

        $model = new $modelName;
        $this->controller = new $controllerName($model);
        $this->view = new $viewName($routeName, $model);

        if (!empty($action)) $this->controller->{$action}();
    }

    public function output() {

        if (!empty($this->view))
        {
            return $this->view->output();
        }
    }

}

当我传入一个路线对象时,其属性如下:

  route-> model = 'UserModel'
  route-> view = 'LoginView'
  route-> controller = 'LoginController'

PHP告诉我无法找到课程UserModel

但是,如果我用静态表达式替换上面的内容:

 $model = new UserModel();
 $this->controller = new LoginController();
 $this->view = new LoginView();

代码工作正常,这可能告诉我类可以在我的代码中使用。

我输了。有什么我可以忽略的吗?

进一步查询这段代码

if (!class_exists("UserModel")) die("No UserModel");
告诉我课程不存在。那么我怎么可能用new UserModel()构建它,我该如何修复呢?

2 个答案:

答案 0 :(得分:2)

您必须为存储在变量中的类名指定名称空间,因为它们是在运行时解析的:

$class = 'Your\Full\Namespace\Path\UserModel';
// ...
$object = new $class;

PHP无法可靠地检测您为动态类名隐含的名称空间。

此外,随着项目的发展,跟踪依赖关系变得越来越困难。我建议您实施autoloading系统,或使用现有的解决方案,例如Composer

答案 1 :(得分:0)

也许你可以检查

class_exists("UserModel");

如果返回false, 使用下面的代码获取所需的类名,检查它

get_declared_classes();

- 编辑 -

对不起,我误解了你的意思

代码

route-> model = new 'UserModel';
route-> view = new 'LoginView';
route-> controller = new 'LoginController';