class_exists,命名空间不能正常工作PHP 7.2

时间:2018-03-18 22:35:29

标签: php class namespaces

我无法让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';
    }

}

我错过了一些明显的东西吗?

2 个答案:

答案 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))