【问题标题】:class_exists with namespace not working PHP 7.2class_exists 命名空间不工作 PHP 7.2
【发布时间】:2018-03-18 22:35:29
【问题描述】:

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

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

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

我正在检查的类是 Posts.php 在 Router.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

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

if (class_exists('Project\\Controllers\\' . $controller))

但同样,找不到类。

这里是 Posts.php

namespace Project\Controllers;

class Posts
{

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

}

我在这里遗漏了什么明显的东西吗?

【问题讨论】:

  • 尝试 class_exists('\\Project\\Controllers\\'.$controller) 并且不要忘记包含您的课程,例如。使用 Project\Controllers\ClassName;
  • 不,同样的.. 未捕获的错误:在....中找不到类“帖子”

标签: php class namespaces


【解决方案1】:

破解了!

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

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

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

【讨论】:

    【解决方案2】:

    我想我找到了你遗漏的地方。您正确获得了这段代码,并且您的代码进入了这个 if 条件,但是当您实例化对象时,您忘记使用完整的命名空间路径。所以 PHP 会寻找一个名为“Posts”的类,它与脚本不在同一个命名空间中。

     if (class_exists('Project\\Controllers\\' . $controller))
    

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多