2013-08-19 3 views
2

SO,별칭이있는 동적 이름 공간 클래스

네임 스페이스를 사용하여 동적 개체를 만드는 데 문제가 있습니다. 내가 가진 클래스 Bar의 개체를 만들려고 해요, 지금

namespace Foo 
{ 
    class Bar 
    { 
    } 
} 

:

include('namespace.php'); 
$sName = 'Bar'; 
$sClass = '\\Foo\\'.$sName; 
$rObj = new $sClass; //correct object 

을하고 모든 것을 잘가는 다음은 네임 스페이스 코드입니다.

include('namespace.php'); 
use Foo as Baz; 
$sName = 'Bar'; 
$sClass0= '\\Foo\\'.$sName; 
$sClass1= '\\Baz\\'.$sName; 
$rObj = new $sClass0; //correct object 
$rObj = new $sClass1; //Fatal error 

그리고 (이름은 여전히 ​​잘 작동을 통해 및 접근) 나는 물체 등의 방법을 인스턴스화 할 수없는 해요 :하지만, 지금은 같은 별명과 일을 뭔가를 사용하고 싶습니다. 내 질문은 - 어떻게 든 별칭을 통해 클래스에 액세스 할 수 있습니까? 그렇다면 어떻게해야합니까? $sClass1='Baz\\'.$sName을 사용할 때도 액세스하려고 시도했지만 성공하지 못했습니다. 또한, get_declared_classes() 함수를 통해 선언 된 클래스를 검사했습니다.이 클래스는 \Foo\Bar 클래스 (별칭에 대한 참조 없음) 만 있음을 보여줍니다.

중요한지 확실하지 않지만 PHP 5.5 버전을 사용하고 있습니다.

답변

5

파서 만 네임 스페이스 별칭을 사용하여 각 파일 내에서 클래스 참조를 정규화합니다.

다른 말로하면 다른 코드에서 사용할 수있는 일종의 글로벌 별칭을 소개하지 않습니다. 스크립트가 파싱되면 별칭은 더 이상 사용되지 않습니다.

이 동작은 또한 the manual에 설명되어 있습니다 :

가져 오기는 동적 클래스, 함수 나 상수 이름에 영향을주지 않습니다 때문에 컴파일 시간에 수행하고있다.

+0

같은 대답을 원하면 별칭이 컴파일 시간입니다. 변수와 클래스 이름은 런타임이기 때문에 클래스 이름 문자열을 일부 작성자/팩토리 함수/메소드를 통해 대체하는 것과 같은 자체 런타임 별칭이 필요합니다. – hakre

+0

이 시점에서 나는 앨리어싱의 아키텍처를 오해했습니다. –

+0

@hakre 매뉴얼의 발췌 부분을 추가했습니다. –