class_exists 与命名空间不起作用 PHP 7.2

spi*_*ice 1 php namespaces class

我无法让 class_exists 查看我的类文件。

更烦人的是,如果我真的直接包含类文件,它会抱怨我不能包含它,因为类已经存在!说一记耳光。

这显然有很多部分,所以我将尝试包括相关的部分:

我正在检查的类是Router.php中函数中的 Posts.php

目录结构:

app
|
--->Project
   |
   |--->Controllers
   |   |
   |   --->Posts.php
   |
   |--->Core
   |   |
   |   --->Router.php
Run Code Online (Sandbox Code Playgroud)

类名(控制器)是从查询字符串的一部分中提取出来的,它已经过测试和工作。即 - mysite.com/posts/view 将导致类名作为“帖子”传递,就像它应该用于 psr4 一样。

路由器调度功能出问题的部分。

if (class_exists($controller)) {
    $controller_object = new $controller();

 } else {
      echo "Controller class $controller missing";
 }
Run Code Online (Sandbox Code Playgroud)

我试过直接包含类,就像我说的那样,我收到关于包含同一个类两次的警告。

我也试过使用类常量:

 if (class_exists($controller::class)) {
Run Code Online (Sandbox Code Playgroud)

但得到:

Fatal error: Dynamic class names are not allowed in compile-time
Run Code Online (Sandbox Code Playgroud)

还尝试使用完整的命名空间 url:

if (class_exists('Project\\Controllers\\' . $controller))
Run Code Online (Sandbox Code Playgroud)

但同样,找不到类。

这是 Posts.php

namespace Project\Controllers;

class Posts
{

    public function index()
    {
        echo 'It Works';
    }

}
Run Code Online (Sandbox Code Playgroud)

我在这里遗漏了一些明显的东西吗?

spi*_*ice 5

破解了!

需要将命名空间 url 与类连接起来并将其设置为变量,然后才能使用它创建新的 $controller 对象。因此,它在使用命名空间 url 提供时通过了 class_exists 检查,但在新对象上失败,因为它超出了范围。

$controller = 'Project\\Controllers\\' . $controller;

if (class_exists($controller)) {
   $controller_object = new $controller();
.......
Run Code Online (Sandbox Code Playgroud)