2011-04-08 11 views
7
  • My\Namespace
    • \My\Namespace

Así que, ¿cuál debería usar, veo la php documentation utiliza sobre todo My\Namespace.Espacios de nombres PHP: My Namespace o My Namespace?

Pero se dice que \My\Namespace es mejor, porque no ambiguo, mientras que My\Namespace se pudo resolver como \RandomNamespace\My\Namespace.

he empezado a preguntarse acerca de esto después de leer hay un problema en la Doctrina 2 de este: "Please replace 'Doctrine\XXX\YYY' with '\Doctrine\XXX\YYY' in code and document"

Por lo tanto, ¿tiene más información acerca de esto? Gracias

Respuesta

4

Esto no es diferente de usar rutas de archivos/uri relativas vs. absolutas y se reducirá a las preferencias. Sin embargo, a diferencia de las rutas absolutas, estoy de acuerdo con el menos ambiguo \My\Namespace porque nunca se romperá, donde podrían existir espacios de nombres relativos.

Los alias del espacio de nombres, a través de use se suman a la abiguidad de los nombres relativos del espacio de nombres. Por ejemplo, puedo decir: use \PDO as YourMom y más tarde llamar al YourMom dentro del código. ¿Es \PDO, \YourMOM o YourMom que se está llamando? Obviamente, el alias gana y se resuelve en \PDO, asumiendo que no hay conflicto, pero hace que el código sea difícil de seguir.

Editar

Ejemplo de código para probar abiguity es posible. Asegúrese de que vea el fallback global aplicado si un espacio de nombre no está calificado.

Según lo mencionado por @netcoder, es imposible ser ambiguo durante la declaración de un espacio de nombres. Por lo tanto, namespace My y namespace \My (o cambiar cualquier otra declaración de espacio de nombres a continuación) son 100% idénticos y la declaración califica completamente un espacio de nombre.

namespace My 
{ 
} 

namespace My\Other 
{ 
    use Bob; // Resolves to \My\Other\Bob 
} 

namespace My\Other\NS 
{ 
    use \My\Other as Other; 
    use Other\NS as Duh; // This resolves to \My\Other\NS 
} 

namespace My\Other\Bob 
{ 
    use Other\NS as Duh; // This resolves to \Other\NS becuase the namespace doesn't exist inside \My\Other\Bob 
} 
3

En la declaración del espacio de nombres en sí no importa. Esta declaración define siempre un nombre completo calificado, por lo que puede omitir con seguridad el separador principal del espacio de nombres. Esto también es cierto para la declaración use.

namespace My\Namespace; 
// Is exactly the same as 
namespace \My\Namespace; 

use Foo\Bar as Class1; 
// Is exactly the same as 
use \Foo\Bar as Class2; 

En todos los demás casos, el separador principal asegura que el calificador dado es absoluto, si falta, es relativo. Vea the manual sobre cómo se resuelven.

Si usa solo las clases del mismo espacio de nombres y/o "declara" cada clase en la parte superior del archivo a través del use (y quizás as), puede usar identificadores de clase relativa de forma segura.

2

En realidad hay una diferencia, pero no siempre (ah, a la derecha).

En la construcción use, nunca tiene que 'mencionar' la \ líder. En línea, nunca tendrá que hacerlo si la clase está en el mismo espacio de nombres, o si está utilizando una importación (importada con use ns).

Pero a veces es necesario:

namespace foo; 

class bar extends \baz\Bar { 

Estás usando una línea indefinida/desconocido/no importados de clase, así que hay que mencionar la fuente.

Otro ejemplo es con las clases unnamespaced utilizados en un espacio de nombres, en línea:

namespace foo; 

$dt = new \DateTime; 

Una mejor práctica (en general) es importar todas las clases de las necesidades actuales de archivos. Una declaración de uso es muy, muy, muy, muy barata, así que no te contengas.

namespace foo; 

use baz\Bar AS OtherBar; 
use \DateTime; 

class Bar extends OtherBar { // or something like that; in this case (same class name) it's tricky 
    function __construct() { 
    $dt = new DateTime; 

editar 1
Además, no se olvide de utilizar nombres de las clases de espacios de nombres totalmente al pasar como cadenas, a pesar de que es posible que en el espacio de nombres derecha:

namespace foo; 

$class = 'foo\bar'; 
+1

"en el Usa constructo, nunca tienes que 'mencionar' al líder \ ": ¿por qué? (Estoy tratando de juntar todas las piezas) –

+0

@MatthieuNapoli Porque 'use' siempre funciona desde la raíz. El '\' principal está implícito, por lo que es innecesario escribirlo. Es mucho más limpio sin. Wow, esta respuesta tiene solo 2,5 años de retraso ... – Rudie

+0

última respuesta sigue siendo una respuesta :) –