2015-05-18 21 views
8

Không chắc chắn về tiêu đề hay nhất nhưng tôi sẽ giải thích những gì tôi đang yêu cầu tốt nhất có thể. Giả sử tôi có các tập tin sau đây:Nhận tuyên bố sử dụng từ lớp

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

Bây giờ nếu tôi được sử dụng phản chiếu, tôi có thể nhận được các tên lớp đầy đủ từ các gợi ý gõ vào xây dựng.

Tuy nhiên, tôi sẽ nhận được FooNamespace\FooClassBarNamespace\BarClass. Không, FooNamespace\FooClassBarNamespace\Bar. Tôi cũng sẽ không được tham chiếu đến BazNamespace\BazClass.

Về cơ bản, câu hỏi của tôi là: Làm cách nào để có được tên đủ điều kiện từ MyCustomClass.php trong khi chỉ biết FooClass, Bar và, BazSpecial?

Tôi không muốn sử dụng trình phân tích tệp vì điều này sẽ ăn hiệu suất. Tôi muốn có thể làm một việc gì đó như:

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

Tôi sẽ làm như thế nào?

Trả lời

1

Thấy không ai trả lời, tôi cho rằng không có cách nào dễ dàng để đạt được điều này. Do đó tôi đã tạo ra lớp học của riêng tôi gọi là ExtendedReflectionClass mà đạt được những gì tôi cần.

Tôi đã tạo ra một ý chính với tệp lớp và một readme, nằm ở phía dưới để cuộn xuống !.

ExtendedReflectionClass

Cách sử dụng ví dụ:

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 
Các vấn đề liên quan