Ver que la respuesta aceptada ya esté incluida. Sin embargo, un código que puede usar para aprovechar los espacios de nombres relativos (nota: no dude en utilizar el código a continuación gratis y no se requiere referencia al autor en su código, el autor no ofrece garantías y el uso del código está bajo su propio riesgo)
actualización: el código se puede utilizar dentro de su clase para cargar de forma dinámica y rápida otras clases a través de espacios de nombres relativos. El inicio de este tema busca una forma de extender la clase a otra clase a través del espacio de nombres relativo, que tampoco es posible con este código.
en su clase sólo tiene que añadir el siguiente código:
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 '';
}
}
espacios de nombres en PHP no se pueden anidar: no hay una jerarquía por la opinión. Cada espacio de nombres se declara de manera independiente el uno del otro, no hay relaciones padre-hijo entre los espacios de nombres (todavía). 'Foo \ Bar' es un espacio de nombres totalmente diferente que' Foo \ Bar \ Baz'. – netcoder
Así que me encontré con esto y me di cuenta de que no necesitaba exactamente el espacio de nombres principal, podía hacer lo que necesitaba desde el espacio de nombres global, pero no sabía cómo llegar allí. Resulta que todo lo que necesita hacer es iniciar el espacio de nombres con una barra invertida y no usará el espacio de nombres de anidación. Entonces, si estás en el espacio de nombres 'Foo \ Bar' y llamas' new Baz \ Bat() 'estará en el espacio de nombres' Foo \ Bar \ Baz \ Bat() '. Sin embargo, si llama 'new \ Baz \ Bat()', estará en el espacio de nombres 'Baz \ Bat()'. – TorranceScott