네임 스페이스 Inori \ 테스트;
클래스 MainTest { }
예 2 :
네임 스페이스 Inori \ 테스트 \ 하위 검사;
class SubTest extends? { }
질문 :는 하위 검사가 MainTest을 확장 할 수 있도록 신속 네임 스페이스의 수준을 갈 수있는 방법은 무엇입니까? "../MainTest"
과 같은 무엇입니까? 또는 \Inori\Test\MainTest
으로 붙어 있습니까?
네임 스페이스 Inori \ 테스트;
클래스 MainTest { }
예 2 :
네임 스페이스 Inori \ 테스트 \ 하위 검사;
class SubTest extends? { }
질문 :는 하위 검사가 MainTest을 확장 할 수 있도록 신속 네임 스페이스의 수준을 갈 수있는 방법은 무엇입니까? "../MainTest"
과 같은 무엇입니까? 또는 \Inori\Test\MainTest
으로 붙어 있습니까?
상대 네임 스페이스는 지원되지 않습니다. 그래도 요청이 있습니다. https://bugs.php.net/bug.php?id=52504
파일 상단에서 수업을 가져 오는 경우 큰 문제가 아닙니다.
namespace Inori\Test\SubTest;
use Inori\Test\MainTest;
class SubTest extends MainTest { }
'use'는 앨리어싱/임포트라고 불리며, 5 가지 방식으로 사용할 수 있습니다 : http://php.net/manual/en/language.namespaces.importing.php –
허용되는 대답이 이미 나와 있습니다. 그러나 여기에서 상대 네임 스페이스를 활용하는 데 사용할 수있는 코드 (참고 : 아래 코드는 무료로 사용하고 코드 작성자는 참조 할 필요가 없으며 작성자가 보증을 제공하지 않으며 코드 사용 자체가 위험에 노출됩니다.).
업데이트 : 코드를 클래스 내에서 사용하여 상대적 네임 스페이스를 통해 다른 클래스를 동적으로 빠르게로드 할 수 있습니다. 이 주제의 초보자는 상대 네임 스페이스를 통해 클래스를 다른 클래스로 확장하는 방법을 찾고 있습니다.이 코드는이 코드로는 불가능합니다. 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 '';
}
}
이것은 정말로 원래의 질문에 도움이되지 않습니다. 'class child extends? '에서 물음표 대신 작성하십시오. {...}'자식은 위의 한 수준의 네임 스페이스를 상속합니다. –
네임 스페이스가 중첩 될 수 없습니다 : 클래스에서
는 다음 코드를 추가 말 당에는 계층이 없습니다. 각 네임 스페이스는 서로 독립적으로 선언되며 네임 스페이스 간에는 부모 - 자식 관계가 없습니다 (아직). 'Foo \ Bar'는'Foo \ Bar \ Baz'와 완전히 다른 네임 스페이스입니다. – netcoder
그래서 나는이 문제를 보았고 부모 네임 스페이스가 필요 없다는 것을 깨달았습니다. 저는 글로벌 네임 스페이스에서 필요한 것을 할 수는 있었지만 거기에 도달하는 방법을 모르고있었습니다. 역 슬래시로 네임 스페이스를 시작하면 중첩 네임 스페이스를 사용하지 않아도됩니다. 따라서'Foo \ Bar' 네임 스페이스에 있고'new Baz \ Bat()'를 호출하면'Foo \ Bar \ Baz \ Bat()'네임 스페이스에있게됩니다. 그러나'new \ Baz \ Bat()'를 호출하면'Baz \ Bat()'네임 스페이스에있게됩니다. – TorranceScott