【问题标题】:How to tell the list of classes under a namespace如何告诉命名空间下的类列表
【发布时间】:2016-02-05 03:54:08
【问题描述】:

如何过滤整个命名空间层次结构以查看我的包是否已成功自动加载(以及对这些类的额外处理)

我在 SO 上寻找过类似的问题,但似乎没有人针对这个具体案例回答。

例如,我想在整个框架启动后获取 Laravel 控制器中的类列表。

我正在寻找已在 composer.json 中自动加载或从包中添加的自定义命名空间。

CompanyNS\SpecificApplicationNS\Shazbat

如何查看所有内容以查看在 Shazbat 下加载了哪些类?

有什么方法可以让vendor/composer/autoload_psr4.php 做点什么吗?

这些类可能是从其他外部包加载的。

感谢期待。

【问题讨论】:

  • var_dump(class_exists('CompanyNS\SpecificApplicationNS\Shazbat'));
  • 在这种情况下,Shazbat 是命名空间而不是我想要测试存在的类
  • 你需要将你的类添加到命名空间以检查类是否存在
  • 这个问题听起来对更广泛的受众有用,而不仅仅是 Laravel 用户。你对删除标题中的“in Laravel”部分和 Laravel 标签有何感想? (也许用 [composer] 替换它?)
  • 会有各种各样的类,它们的名称在运行时不一定是已知的。这就是为什么我想知道“命名空间下”有哪些类

标签: php laravel composer-php


【解决方案1】:

因此,要获取在唯一命名空间下声明的所有类,在本例中仅使用命名空间名称“foo\bar”,您可以执行以下操作。

# lets assume this is the namespace, we don't know how many classes it has
# inside it, but we want to find them. 
namespace foo\bar{
   class foo_a{}
   class bar_a{}
}

# this is a namespace, we don't want to find these classes inside it. 
namespace tar\baz{
 class tar_a{}
 class baz_a{}  
}

namespace main{
    # this is the only code you need. wrap it in a function if you want
    $namespace = 'foo\bar';
    foreach(\get_declared_classes() as $class){
        if(strpos($class, $namespace) === 0){
            $c = substr($class, strlen($namespace));
            echo 'class ' . $c . ' exists in namespace '. $namespace . '<br/>'; 
        }
    }
}

输出

类 \foo_a 存在于命名空间 foo\bar
类 \bar_a 存在于命名空间 foo\bar

【讨论】:

  • 在哪里定义它们并不重要。只要你知道这种情况下的命名空间$namespace = 'foo\bar';你就可以找到它们
  • 感谢@samayo,您的代码可以工作,但是在 Laravel 中它只显示服务提供者而不是实际的类。你知道为什么会这样吗?类和服务提供者在同一个目录下,在同一个命名空间下。
  • 这不会只显示已经自动加载的类吗?自动加载允许 PHP 在运行时确定从哪里加载类,但在加载之前,我认为它不在 get_declared_classes 中。
  • @HowApped 为什么要显示服务提供者而不是在同一目录中找到的实际类?你能用目录更新问题吗?这样我们就可以调试问题了
  • @blockhead 如果您看到示例,则没有实例化类。它只调用声明的类。不多不少
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2014-06-14
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多