Пространства имен PHP - поднимайтесь на уровень?
Пример1:
пространство имен Inori\Test;
класс MainTest { }
Пример2:
пространство имен Inori\Test\SubTest;
класс SubTest расширяет???? { }
Вопрос: есть ли способ быстро подняться на уровень в пространстве имен, чтобы SubTest мог расширить MainTest? что-то вроде "../MainTest"
? Или я застрял с \Inori\Test\MainTest
?
Ответы
Ответ 1
Относительные пространства имен не поддерживаются. Там есть просьба:
https://bugs.php.net/bug.php?id=52504
Если вы импортируете свои классы в верхней части файла, это не должно быть большой сделки.
namespace Inori\Test\SubTest;
use Inori\Test\MainTest;
class SubTest extends MainTest { }
Ответ 2
Посмотрите, что принятый ответ уже предоставлен. Тем не менее, таким образом, код, который вы можете использовать для использования относительных пространств имен (обратите внимание: не стесняйтесь использовать код ниже бесплатно, а ссылка на автора в вашем коде не требуется, гарантии не предоставляются автором, а использование кода - на свой страх и риск).
update: код может использоваться внутри вашего класса для динамического и быстрого загрузки других классов через относительные пространства имен. Стартер этой темы ищет способ расширить класс к другому классу через относительное пространство имен, которое остается невозможным и не с этим кодом.
В вашем классе просто добавьте следующий код:
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 '';
}
}