Смотрите, что принятый ответ уже предоставлен. Тем не менее, таким образом, код, который вы можете использовать, чтобы воспользоваться преимуществами относительных пространств имен (примечание: не стесняйтесь использовать приведенный ниже код бесплатно и ссылка на автора в вашем коде не требуется, автор не предоставляет никаких гарантий, и использование кода на свой страх и риск ).
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 '';
}
}