我试图用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()
构建它,我该如何修复呢?
答案 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';