2014-10-21 4 views
1

특성을 사용하는 이와 같은 간단한 클래스가 있다고 가정 해 보겠습니다.특성을 사용하여 클래스의 네임 스페이스 검색

<?php namespace A\B; 

use C\FooTrait; 

class D { 
    use FooTrait; 
} 

내 특성은 다음과 같습니다.

<?php namespace C; 

class FooTrait { 

    public function getBaseNamespace() 
    { 
     // code 
    } 

} 

내 예상되는 동작은 다음과 같습니다

<?php 
$d = new D; 
// Shoud be 'A\B'; 
$d->getBaseNamespace(); 

그러나 지금까지 내가 반사 API를 사용하여이 작업을 수행 할 수 없었다. 모든 단서?

+0

리플렉션을 사용하려는 곳은 어디입니까? – Flosculus

+0

@Flosculus 리플렉션 API는 클래스의 네임 스페이스를 가져 오는 메소드를 제공합니다. 그러나 특성 자체를 사용하여 클래스의 이름을 검색 할 수 없었습니다. –

답변

1

리플렉션을 사용하는 것보다 조금 더 간단 할 수 있습니다.
특성 방법 내에서 결정하려는 경우.

당신은 사용할 수 있습니다

public function getBaseNamespace() 
{ 
    return preg_replace('/(.+)\\\\[^\\\\]+/', '$1', __CLASS__); 
} 
+0

'__CLASS__' 상수를 주셔서 감사합니다. 그게 내가 무엇을 찾고 있었는지 :) –

+1

http://php.net/manual/en/language.constants.predefined.php, 그것이 특징으로 작동한다고 말합니다. 5.4+ – Flosculus

+0

좋아요! 그것은 확실히가는 길입니다. Regex보다 리플렉션 API를 사용하여 가독성을 향상시키는 데는 문제가 없습니다. –

0

내 최종 구현은 다음과 같다.

<?php namespace Tools\Namespaces; 

use ReflectionClass; 

trait NamespaceTrait { 

    public function getBaseNamespace() 
    { 
     $reflection = new ReflectionClass(__CLASS__); 
     return $reflection->getNamespaceName().'\\'; 
    } 
}