从课堂上获取使用声明

Ozz*_*zzy 8 php reflection namespaces fully-qualified-naming

不太确定最好的头衔,但我会尽我所能解释我的要求.假设我有以下文件:

MyCustomClass.php

<?php    

namespace MyNamespace;

use FooNamespace\FooClass;
use BarNamespace\BarClass as Bar;
use BazNamespace\BazClass as BazSpecial;

class MyCustomClass {

    protected $someDependencies = [];

    public function __construct(FooClass $foo, Bar $bar) {

        $someDependencies[] = $foo;
        $someDependencies[] = $bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我要使用反射,我可以从构造中的类型提示中获取完全限定的类名.

但是,我会接受FooNamespace\FooClassBarNamespace\BarClass.不,FooNamespace\FooClassBarNamespace\Bar.我也没有参考BazNamespace\BazClass.

基本上,我的问题是:我怎样才能得到完全合格的名称MyCustomClass.php,而只知道FooClass,Bar和,BazSpecial

我不想使用文件解析器,因为这会吃掉性能.我希望能够做到这样的事情:

$class = new ReflectionClass('MyCustomClass');
...
$class->getUsedClass('FooClass'); // FooNamespace\FooClass
$class->getUsedClass('Bar'); // BarNamespace\BarClass
$class->getUsedClass('BazSpecial'); // BazNamespace\BazClass
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

Ozz*_*zzy 2

鉴于没有人回答,我认为没有一种简单的方法可以实现这一目标。因此,我创建了自己的类,名为ExtendedReflectionClass它可以实现我的需要。

我已经用类文件和自述文件创建了一个要点,它位于底部,所以请滚动!

扩展反射类

使用示例

require 'ExtendedReflectionClass.php';
require 'MyCustomClass.php';

$class = new ExtendedReflectionClass('MyNamespace\Test\MyCustomClass');

$class->getUseStatements();    
// [
//     [
//         'class' => 'FooNamespace\FooClass',
//         'as' => 'FooClass'
//     ],
//     [
//         'class' => 'BarNamespace\BarClass',
//         'as' => 'Bar'
//     ],
//     [
//         'class' => 'BazNamespace\BazClass',
//         'as' => 'BazSpecial'
//     ]
// ]

$class->hasUseStatement('FooClass'); // true
$class->hasUseStatement('BarNamespace\BarClass'); // true
$class->hasUseStatement('BazSpecial'); // true

$class->hasUseStatement('SomeNamespace\SomeClass'); // false
Run Code Online (Sandbox Code Playgroud)