我无法让class_exists看到我的类文件。
更令人讨厌的是,如果我实际上直接包含了类文件,它会因为类已经存在而无法包含它!谈论一记耳光。
显然有很多部分,所以我只想尝试包含相关的部分:
我正在检查的课程是在Router.php内的一个函数中 Posts.php
目录结构:
app
|
--->Project
|
|--->Controllers
| |
| --->Posts.php
|
|--->Core
| |
| --->Router.php
正在从查询字符串的一部分中提取类名(控制器),并对其进行测试和工作。 ie - mysite.com/posts/view将导致类名作为“帖子”传递,就像它应该是psr4一样。
路由器调度功能的部分故障所在。
if (class_exists($controller)) {
$controller_object = new $controller();
} else {
echo "Controller class $controller missing";
}
我已经尝试过直接包括这个课程,就像我说的那样,我得到一个关于将同一课程包括两次的警告。
我也尝试过使用类常量:
if (class_exists($controller::class)) {
但得到了:
Fatal error: Dynamic class names are not allowed in compile-time
还尝试使用完整的命名空间网址:
if (class_exists('Project\\Controllers\\' . $controller))
但是,再次找不到课程。
这是Posts.php
namespace Project\Controllers;
class Posts
{
public function index()
{
echo 'It Works';
}
}
我错过了一些明显的东西吗?
答案 0 :(得分:2)
破解了!
需要将命名空间url与类连接并将其设置为变量,然后才能使用它创建新的$ controller对象。因此,在使用命名空间URL提供时,它会传递class_exists检查,但是因为它超出范围而无法使用新对象。
$controller = 'Project\\Controllers\\' . $controller;
if (class_exists($controller)) {
$controller_object = new $controller();
.......
答案 1 :(得分:0)
我想我找到了你错过的地方。你正确地获得了这段代码,并且你的代码会进入这个条件,但是当你实例化你忘记使用完整命名空间路径的对象时。因此,PHP会查找一个名为“Posts”的类,该类与脚本在同一名称空间中不存在。
if (class_exists('Project\\Controllers\\' . $controller))