2015-05-18 6 views
8

Nicht sicher über den besten Titel, aber ich werde erklären, was ich so gut ich kann fragen. Angenommen, ich habe die folgende Datei:Get Use-Anweisung von Klasse

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; 
    } 
} 

Nun, wenn ich Reflektion verwenden, so könnte ich die vollständig qualifizierten Klassennamen aus dem Typ Hinweisen in dem Konstrukt erhalten.

Ich würde jedoch FooNamespace\FooClass und BarNamespace\BarClass erhalten. Nicht, FooNamespace\FooClass und BarNamespace\Bar. Ich würde auch keinen Hinweis auf BazNamespace\BazClass bekommen.

Im Grunde ist meine Frage: Wie kann ich die voll qualifizierten Namen von MyCustomClass.php erhalten, während nur FooClass zu wissen, Bar, und, BazSpecial?

Ich möchte keinen Dateiparser verwenden, da dies die Leistung beeinträchtigt. Ich möchte in der Lage sein, etwas zu tun wie:

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

Wie würde ich darüber gehen?

Antwort

1

Da niemand geantwortet hat, nehme ich an, dass es keinen einfachen Weg gibt, dies zu erreichen. Ich habe daher meine eigene Klasse namens ExtendedReflectionClass erstellt, die das erreicht, was ich brauche.

Ich habe einen Kern mit der Klassendatei und einer Readme erstellt, die unten ist, also scrollen !.

ExtendedReflectionClass

Anwendungsbeispiel:

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