Пространства имен PHP – поднимайтесь на уровень?

Example1:

пространство имен Inori \ Test;

class MainTest {}

Example2:

пространство имен Inori \ Test \ SubTest;

класс SubTest расширяет ???? {}

Вопрос: есть ли способ быстро подняться на уровень в пространстве имен, чтобы SubTest мог расширить MainTest? что-то вроде "../MainTest" ? Или я застрял в \Inori\Test\MainTest ?

Related of "Пространства имен PHP – поднимайтесь на уровень?"

Относительные пространства имен не поддерживаются. Там есть запрос: https://bugs.php.net/bug.php?id=52504

Если вы импортируете свои классы в верхней части файла, это не должно быть большой сделки.

 namespace Inori\Test\SubTest; use Inori\Test\MainTest; class SubTest extends MainTest { } 

Смотрите, что принятый ответ уже предоставлен. Тем не менее, таким образом, код, который вы можете использовать для использования относительных пространств имен (обратите внимание: не стесняйтесь использовать код ниже бесплатно, а ссылка на автора в вашем коде не требуется, гарантии не предоставляются автором, а использование кода – на свой страх и риск ).

update: код может использоваться внутри вашего класса для динамического и быстрого загрузки других классов через относительные пространства имен. Стартер этой темы ищет способ расширить класс до другого класса через относительное пространство имен, что остается невозможным и не с этим кодом.

В вашем классе просто добавьте следующий код:

 public function TestRelativeNamespace() { // (eg, 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 ''; } } не public function TestRelativeNamespace() { // (eg, 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 ''; } }