【发布时间】:2017-11-25 18:07:42
【问题描述】:
我因为找不到类而收到此致命错误:
致命错误:未捕获的错误:找不到类“HomeController”
但文件已包含在内。
require_once self::CONTROLLERS_PATH . $this->controller . '.php';
var_dump(file_exists(self::CONTROLLERS_PATH . $this->controller . '.php'));
new $this->controller;
我通过返回 true 的 var_dumping file_exists 对其进行了调试。我检查了命名空间,一切看起来都很好。如果我 var dump $this->controller,它的值是预期的 - string(14) "HomeController"。如果我像new HomeController(); 那样对其进行硬编码,则该类被初始化。但是,为什么它不能从变量中工作?你可以在下面看到我的代码。这是我的文件结构:
App.php
<?php
namespace App\Core;
class App
{
protected $controller = 'HomeController';
protected $method = 'index';
protected $params = [];
const CONTROLLERS_PATH = '../App/Controllers/';
public function __construct ()
{
$url = $this->parseUrl();
if(file_exists(self::CONTROLLERS_PATH . ucfirst($url[0]) . '.php'))
{
$this->controller = ucfirst($url[0]); //Update $this->controller value
unset($url[0]);
echo 'file exists';
}
require_once self::CONTROLLERS_PATH . $this->controller . '.php';
var_dump(file_exists(self::CONTROLLERS_PATH . $this->controller . '.php'));
var_dump($this->controller);
new $this->controller;
if(isset($url[1]))
{
if(method_exists($this->controller, $url[1]))
{
$this->method = $url[1];
unset($url[1]);
echo 'method exists';
}
}
$this->params = $url ? array_values($url): [];
call_user_func_array([$this->controller, $this->method], $this->params);
var_dump($url);
}
public function parseUrl()
{
if(isset($_GET['url']))
{
return $url = explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
}
}
}
HomeController.php
<?php
namespace App\Controllers;
class HomeController
{
public function index()
{
echo 'asd';
}
}
【问题讨论】:
-
它可能是命名空间吗? (即使它和这个脚本是同一个命名空间)
-
我不明白你的意思。
-
我强烈建议你只使用作曲家自动加载,而不是自己组装解决方案
-
啊,对不起,忘了你必须先把它全部放到一个var中:
$className = "\\App\\Controllers\\".$this->controller;然后new $className; -
那我就把它写成答案
标签: php