【问题标题】:PHP5: get imported namespaces listPHP5:获取导入的命名空间列表
【发布时间】:2011-10-24 22:12:56
【问题描述】:

是否可以在当前上下文中获取 PHP 文件中所有导入的类/命名空间的列表?

例如:

namespace A;
use B, C\D;

我想得到这个数组:

array('B', 'C\D');

原因是我正在构建一个映射器注册表,我希望能够使用当前上下文中的别名类名来查询这个映射器,而不是全名。

例如:

$registry->getMapper('D');

代替:

$registry->getMapper('C\D');

如果可能的话,我不想硬编码这些别名,如果有办法从 PHP 中自动获取它们!

【问题讨论】:

    标签: php oop namespaces


    【解决方案1】:

    【讨论】:

    • 这看起来是实现目标的合理方法,并且来自维护良好的库,例如 Doctrine Common。谢谢!
    【解决方案2】:

    最近在 PHP Internals 邮件列表中对此进行了讨论。简短的回答(据我所知)是否定的。 http://marc.info/?l=php-internals&m=130815747804590&w=2

    【讨论】:

    • 谢谢,正如 Ernesta 的回答中所说,我正在尝试获取 use 值。我知道这些信息可能只对解析器有用,但我希望这些信息可以提供给引擎。
    【解决方案3】:

    这样做的唯一方法是,在您的主 __construct() 上,读取类目录,以获取命名空间的所有可用 php 文件。 (PHP Manual: glob() - Answer 101017)。

    【讨论】:

    • 谢谢,实际上我不是在寻找一种方法来获取定义的命名空间,而是获取use 语句。
    • 然后为它写一个函数来调用用户并注册你的请求。
    【解决方案4】:

    这个问题的最佳答案: is it possible to get list of defined namespaces

    有一些非常方便的代码可以枚举所有命名空间:

        $namespaces=array();
        foreach(get_declared_classes() as $name) {
            if(preg_match_all("@[^\\\]+(?=\\\)@iU", $name, $matches)) {
                $matches = $matches[0];
                $parent =&$namespaces;
                while(count($matches)) {
                    $match = array_shift($matches);
                    if(!isset($parent[$match]) && count($matches))
                        $parent[$match] = array();
                    $parent =&$parent[$match];
    
                }
            }
        }
    
        print_r($namespaces);
    

    【讨论】:

    • 这将返回所有已声明类的命名空间列表,而问题是如何返回 current 文件中命名空间的 imported。很不一样!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2017-01-25
    • 2012-06-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多