2011-08-30 6 views
17

예 1 :PHP 네임 스페이스 - 레벨 올리기?

네임 스페이스 Inori \ 테스트;

클래스 MainTest { }

예 2 :

네임 스페이스 Inori \ 테스트 \ 하위 검사;

class SubTest extends? { }

질문 :는 하위 검사가 MainTest을 확장 할 수 있도록 신속 네임 스페이스의 수준을 갈 수있는 방법은 무엇입니까? "../MainTest"과 같은 무엇입니까? 또는 \Inori\Test\MainTest으로 붙어 있습니까?

+3

네임 스페이스가 중첩 될 수 없습니다 : 클래스에서

는 다음 코드를 추가 말 당에는 계층이 없습니다. 각 네임 스페이스는 서로 독립적으로 선언되며 네임 스페이스 간에는 부모 - 자식 관계가 없습니다 (아직). 'Foo \ Bar'는'Foo \ Bar \ Baz'와 완전히 다른 네임 스페이스입니다. – netcoder

+0

그래서 나는이 문제를 보았고 부모 네임 스페이스가 필요 없다는 것을 깨달았습니다. 저는 글로벌 네임 스페이스에서 필요한 것을 할 수는 있었지만 거기에 도달하는 방법을 모르고있었습니다. 역 슬래시로 네임 스페이스를 시작하면 중첩 네임 스페이스를 사용하지 않아도됩니다. 따라서'Foo \ Bar' 네임 스페이스에 있고'new Baz \ Bat()'를 호출하면'Foo \ Bar \ Baz \ Bat()'네임 스페이스에있게됩니다. 그러나'new \ Baz \ Bat()'를 호출하면'Baz \ Bat()'네임 스페이스에있게됩니다. – TorranceScott

답변

19

상대 네임 스페이스는 지원되지 않습니다. 그래도 요청이 있습니다. https://bugs.php.net/bug.php?id=52504

파일 상단에서 수업을 가져 오는 경우 큰 문제가 아닙니다.

namespace Inori\Test\SubTest; 
use Inori\Test\MainTest; 

class SubTest extends MainTest { } 
+0

'use'는 앨리어싱/임포트라고 불리며, 5 가지 방식으로 사용할 수 있습니다 : http://php.net/manual/en/language.namespaces.importing.php –

1

허용되는 대답이 이미 나와 있습니다. 그러나 여기에서 상대 네임 스페이스를 활용하는 데 사용할 수있는 코드 (참고 : 아래 코드는 무료로 사용하고 코드 작성자는 참조 할 필요가 없으며 작성자가 보증을 제공하지 않으며 코드 사용 자체가 위험에 노출됩니다.).

업데이트 : 코드를 클래스 내에서 사용하여 상대적 네임 스페이스를 통해 다른 클래스를 동적으로 빠르게로드 할 수 있습니다. 이 주제의 초보자는 상대 네임 스페이스를 통해 클래스를 다른 클래스로 확장하는 방법을 찾고 있습니다.이 코드는이 코드로는 불가능합니다. PHP에서

public function TestRelativeNamespace() 
{ 
    // (e.g., param1 = site\lib\firm\package\foo, param2 = .\..\..\different) 
    $namespace = $this->GetFullNamespace(__NAMESPACE__, '.\\..\\..\\different'); 

    // will print namespace: site\lib\firm\different 
    print $namespace; 

    // to create object 
    $className = $namespace . '\\TestClass'; 
    $test = new $className(); 
} 

public function GetFullNamespace($currentNamespace, $relativeNamespace) 
{ 
    // correct relative namespace 
    $relativeNamespace = preg_replace('#/#Di', '\\', $relativeNamespace); 

    // create namespace parts 
    $namespaceParts = explode('\\', $currentNamespace); 

    // create parts for relative namespace 
    $relativeParts = explode('\\', $relativeNamespace); 

    $part; 
    for($i=0; $i<count($relativeParts); $i++) { 
     $part = $relativeParts[$i]; 

     // check if just a dot 
     if($part == '.') { 

      // just a dot - do nothing 
      continue; 
     } 
     // check if two dots 
     elseif($part == '..') { 

      // two dots - remove namespace part at end of the list 
      if(count($namespaceParts) > 0) { 

       // remove part at end of list 
       unset($namespaceParts[count($namespaceParts)-1]); 

       // update array-indexes 
       $namespaceParts = array_values($namespaceParts); 
      } 
     } 
     else { 

      // add namespace part 
      $namespaceParts[] = $part; 
     } 
    } 

    if(count($namespaceParts) > 0) { 
     return implode('\\', $namespaceParts); 
    } 
    else { 
     return ''; 
    } 

} 
+0

이것은 정말로 원래의 질문에 도움이되지 않습니다. 'class child extends? '에서 물음표 대신 작성하십시오. {...}'자식은 위의 한 수준의 네임 스페이스를 상속합니다. –

관련 문제