Example1:
пространство имен Inori \ Test;
- php получить пространство имен включенного файла
- Неожиданный символ на входе: '\' (ASCII = 92) state = 1
- Использование пространства имен в операторах if / else
- Импорт пространства имен и файлов в PHP
- использовать «глобальное пространство имен»;
class MainTest {}
Example2:
пространство имен Inori \ Test \ SubTest;
- Должен ли я использовать глобальные функции PHP?
- Как загрузить представление из альтернативного каталога в Laravel 4
- Что такое пространства имен?
- Пространства имен PHP и "использование"
- Синтаксис обратной косой черты при создании объектов
класс SubTest расширяет ???? {}
Вопрос: есть ли способ быстро подняться на уровень в пространстве имен, чтобы SubTest мог расширить 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 { }
Смотрите, что принятый ответ уже предоставлен. Тем не менее, таким образом, код, который вы можете использовать для использования относительных пространств имен (обратите внимание: не стесняйтесь использовать код ниже бесплатно, а ссылка на автора в вашем коде не требуется, гарантии не предоставляются автором, а использование кода – на свой страх и риск ).
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 ''; } }