2011-08-30 8 views
17

Ejemplo 1:Espacios de nombres de PHP: ¿sube de nivel?

espacio de nombres Inori \ Test;

clase MainTest {}

Ejemplo 2:

espacio de nombres Inori \ Test \ subprueba;

clase SubTest extends ???? {}

Pregunta: hay una manera de ir rápidamente hasta un nivel en el espacio de nombres por lo subprueba podría extender MainTest? algo así como "../MainTest"? ¿O estoy atrapado con \Inori\Test\MainTest?

+3

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

+0

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

Respuesta

19

Los espacios de nombres relativos no son compatibles. Aunque hay una solicitud: https://bugs.php.net/bug.php?id=52504

Si importa sus clases en la parte superior del archivo, no debería ser una gran oferta.

namespace Inori\Test\SubTest; 
use Inori\Test\MainTest; 

class SubTest extends MainTest { } 
+0

Ese 'uso' se llama aliasing/importing, que se puede usar de 5 maneras: http://php.net/manual/en/language.namespaces.importing.php –

1

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 ''; 
    } 

} 
+0

Esto realmente no ayuda con la pregunta original sobre qué escribir en lugar de signos de interrogación en 'clase de niño se extiende ???? {...} 'donde el niño hereda del espacio de nombres un nivel arriba. –

Cuestiones relacionadas