spi*_*ice 1 php namespaces class
我无法让 class_exists 查看我的类文件。
更烦人的是,如果我真的直接包含类文件,它会抱怨我不能包含它,因为类已经存在!说一记耳光。
这显然有很多部分,所以我将尝试包括相关的部分:
我正在检查的类是Router.php中函数中的 Posts.php
目录结构:
app
|
--->Project
   |
   |--->Controllers
   |   |
   |   --->Posts.php
   |
   |--->Core
   |   |
   |   --->Router.php
类名(控制器)是从查询字符串的一部分中提取出来的,它已经过测试和工作。即 - 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
还尝试使用完整的命名空间 url:
if (class_exists('Project\\Controllers\\' . $controller))
但同样,找不到类。
这是 Posts.php
namespace Project\Controllers;
class Posts
{
    public function index()
    {
        echo 'It Works';
    }
}
我在这里遗漏了一些明显的东西吗?
破解了!
需要将命名空间 url 与类连接起来并将其设置为变量,然后才能使用它创建新的 $controller 对象。因此,它在使用命名空间 url 提供时通过了 class_exists 检查,但在新对象上失败,因为它超出了范围。
$controller = 'Project\\Controllers\\' . $controller;
if (class_exists($controller)) {
   $controller_object = new $controller();
.......