2014-03-13 2 views
0

여러 메소드의 @returns phpdoc 주석을 구문 분석하고 있습니다. 어떻게 든 클래스의 절대 이름을 얻을 수있는 방법이 있습니까? 예를 들어PHP 주석 - 클래스의 절대 이름 얻기

:

namespace Y; 

use X\A; 

class B { 

} 

class C { 
    /** @return A */ 
    public function getA(){} 

    /** @return B */ 
    public function getB(){} 
} 

내가이

array(
    'Y\C' => array(
     'getA' => array(
      'returns' => 'X\A' 
     ), 
     'getB' => array(
      'returns' => 'Y\B' 
     ) 
    ) 
); 

같은 것을 필요로 현재 내가이 있습니다

array(
    'Y\C' => array(
     'getA' => array(
      'return' => 'A' 
     ), 
     'getB' => array(
      'return' => 'B' 
     ) 
    ) 
); 

참고 : 나는의 Y\B 해결할 수있는 I 때문에 reflectionClass의 네임 스페이스를 읽을 수는 있지만 무엇이 내가 바로 현재 use 토큰을 구문 분석뿐만 아니라 다른 파일을 구문 분석 특성 및 상속에 의해, 클래스 ReflectionClass::getFileName()의 파일을 얻을 수있는 유일한 솔루션입니다 경우 ... 사용 문으로

답변

0

을 할 수 있습니다. 그런 다음 클래스에 대한 별칭 맵을 만들고 별칭 맵을 사용하여 @return 주석에서 설명하는 클래스 또는 인터페이스의 절대 클래스 이름을 가져올 수 있습니다. 예를 들어 Doctrine TokenParser은이 접근법에서 use 문을 얻는 구현입니다 ...

그렇습니다. 별칭을 얻을 수는 있지만 PHP에서 특수 효과에 대한 기본 지원이 없으므로 이는 단지 해결 방법입니다. .

간단한 예 :

use Doctrine\Common\Annotations\TokenParser; 
use ReflectionClass; 

function getAliases($className){ 
    $annotatedClass = new ReflectionClass($className); 
    $namespace = $annotatedClass->getNamespaceName(); 
    $aliases = array(); 
    $classFile = $annotatedClass->getFileName(); 
    if ($classFile) { 
     $classCode = file_get_contents($classFile); 
     $tokenParser = new TokenParser($classCode); 
     $aliases = $tokenParser->parseUseStatements($namespace); 
    return $aliases; 
} 

반환

array(
    strtolower($aliasName) => $className, 
    ... 
) 
+0

당신이 완전히 반환 태그의 클래스 이름을의 네임 시도 했습니까? – ashnazg

+0

Nope. 그래서 TokenParser 클래스가있는 파일 별칭을 얻으려면 필요합니다 ... Btw. php가 ['token_get_all'] (http://www.php.net/manual/en/function.token-get-all.php) 함수를 가지고 있기 때문에 그렇게 파서를 작성하는 것은 그리 어렵지 않습니다 ... – inf3rno