(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Esta FAQ se desglosa en dos secciones: las preguntas frecuentes, y los puntos particulares de la implementación, que pueden ser útiles para la comprensión global.
Primero, las preguntas frecuentes.
\mon\nom
o
\nom
?
mon\nom
?
nom
?
nom
?
A continuación se muestran los puntos particulares de la implementación, que pueden ser útiles para la comprensión global.
null
, true
o false
No, los espacios de nombres no afectan el código existente, de una manera u otra, ni el código que se producirá y que no utiliza los espacios de nombres. Se puede escribir esto si se desea:
Ejemplo #1 Acceso a una clase global desde fuera de un espacio de nombres
<?php
$a = new \stdClass;
?>
Es una funcionalidad equivalente a:
Ejemplo #2 Acceder a clases globales fuera de un espacio de nombres
<?php
$a = new stdClass;
?>
Ejemplo #3 Acceso a las clases internas desde un espacio de nombres
<?php
namespace foo;
$a = new \stdClass;
function probar(\ArrayObject $ejemploalusiónatipo = null) {}
$a = \DirectoryIterator::CURRENT_AS_FILEINFO;
// extender una clase interna o global
class MiExcepción extends \Exception {}
?>
Ejemplo #4 Acceso a las clases, funciones y constantes internas en un espacio de nombres
<?php
namespace foo;
class MiClase {}
// usar una clase desde el espacio de nombres actual como una declaración de tipo
function probar(MiClase $ejemploalusiónatipo = null) {}
// otra manera de usar una clase desde el espacio de nombres actual una declaración de tipo
function probar(\foo\MiClase $ejemploalusiónatipo = null) {}
// extender una clase desde el espacio de nombres actual
class Extendida extends MiClase {}
// acceder a una función global
$a = \funcglobal();
// acceder a una constante global
$b = \INI_ALL;
?>
\mon\nom
o
\nom
?
Los nombres que comienzan con \
siempre se resuelven en lo
que parecen, por lo que \mon\nom
es en realidad
mon\nom
, y \Exception
es
Exception
.
Ejemplo #5 Nombres de espacios absolutos
<?php
namespace foo;
$a = new \mi\nombre(); // instancia a la clase "mi\nombre"
echo \strlen('hola'); // llama a la función "strlen"
$a = \INI_ALL; // $a está establecida al valor de la constante "INI_ALL"
?>
mon\nom
?
Los nombres que contienen un antislash pero no comienzan con un
antislash, como mon\nom
pueden ser resueltos de dos maneras
diferentes.
Si ha habido una instrucción de importación que hace un alias de
mon
, entonces el alias importado se aplica en lugar
de mon
, y el espacio de nombres se convierte en mon\nom
.
De lo contrario, el espacio de nombres actual se añade antes del camino de la clase
mon\nom
.
Ejemplo #6 Nombres calificados
<?php
namespace foo;
use blah\blah as foo;
$a = new mi\nombre(); // instancia a la clase "foo\mi\nombre"
foo\bar::nombre(); // llama a método estático "nombre" de la clase "blah\blah\bar"
mi\bar(); // llama a la función "foo\mi\bar"
$a = mi\BAR; // establece $a al valor de la constante "foo\mi\BAR"
?>
nom
?
Los nombres de clases que no contienen un antislash como
nom
pueden ser resueltos de dos maneras diferentes.
Si hay una instrucción de importación que define un alias para nom
,
entonces el alias se aplica.
De lo contrario, el espacio de nombres actual se utiliza y se prefiere a
nom
.
Ejemplo #7 Clases sin calificación
<?php
namespace foo;
use blah\blah as foo;
$a = new nom(); // instancia la clase "foo\nom"
foo::nom(); // llama al método estático "nom" en la clase "blah\blah"
?>
nom
?
Las funciones y constantes que no tienen un antislash en su nombre
como nom
se resuelven de dos maneras diferentes:
Primero, el espacio de nombres actual se prefiere a nom
.
Luego, si la constante o la función nom
no existe
en el espacio de nombres actual, se utiliza la versión global de la constante o la
función nom
.
Ejemplo #8 Funciones y constantes sin espacio de nombres
<?php
namespace foo;
use blah\blah as foo;
const FOO = 1;
function mi() {}
function foo() {}
function sort(&$a)
{
\sort($a); // invoca a la función global "sort"
$a = array_flip($a);
return $a;
}
mi(); // calls "foo\mi"
$a = strlen('hola'); // llama a la función global "strlen" ya que "foo\strlen" no existe
$array = array(1,3,2);
$b = sort($array); // llama a la función "foo\sort"
$c = foo(); // llama a la función "foo\foo" - la importación no se aplica
$a = FOO; // establece $a al valor de la constante "foo\FOO"; la importación no se aplica
$b = INI_ALL; // establece $b al valor de la constante "INI_ALL"
?>
La combinación de scripts siguiente es válida:
file1.php
<?php
namespace mis\cosas;
class MiClase {}
?>
another.php
<?php
namespace otro;
class cosa {}
?>
file2.php
<?php
namespace mis\cosas;
include 'fichero1.php';
include 'otro.php';
use otro\cosa as MiClase;
$a = new MiClase; // instancia a la clase "cosa" del espacio de nombres otro
?>
No hay conflicto de nombres, aunque la clase MiClase
existe
en el espacio de nombres mes\trucs
, ya que la definición de
MiClase
está en un fichero separado. Sin embargo, el ejemplo
siguiente produce un error fatal debido a un conflicto de nombres, ya que
MiClase
está definida en el mismo fichero que la instrucción
use
.
<?php
namespace mis\cosas;
use otro\cosa as MiClase;
class MiClase {} // error fatal: MiClase entra en conflicto con la sentencia de importación
$a = new MiClase;
?>
PHP no permite anidar espacios de nombres.
<?php
namespace mis\cosas {
namespace anidado {
class foo {}
}
}
?>
<?php
namespace mis\cosas\anidado {
class foo {}
}
?>
Es muy importante tener en cuenta que, como los antislash se utilizan como caracteres de protección en las cadenas, siempre deben ser duplicados para poder ser utilizados en una cadena. De lo contrario, existe el riesgo de uso inesperado:
Ejemplo #9 Peligros del uso de los espacios de nombres en una cadena
<?php
$a = "peligroso\nombre"; // ¡\n es una nueva línea dentro de las cadenas entre comillas dobles!
$obj = new $a;
$a = 'sin\peligro\alguno'; // aquí sin problemas.
$obj = new $a;
?>
Toda constante indefinida que no esté calificada, como
FOO
producirá una advertencia: PHP suponía que
FOO
era el valor de la constante. Toda constante,
calificada parcialmente o totalmente, que contenga un antislash, producirá un error fatal si está indefinida.
Ejemplo #10 Constantes indefinidas
<?php
namespace bar;
$a = FOO; // produce un aviso - constante no definida "FOO" se asume que es "FOO";
$a = \FOO; // error fatal, constante FOO del espacio de nombres no definida
$a = Bar\FOO; // error fatal, constante bar\Bar\FOO del espacio de nombres no definida
$a = \Bar\FOO; // error fatal, constante Bar\FOO del espacio de nombres no definida
?>
null
, true
o false
Todo intento en un espacio de nombres de reemplazar las constantes nativas o especiales, produce un error fatal.
Ejemplo #11 Constantes que no pueden ser redefinidas
<?php
namespace bar;
const NULL = 0; // error fatal;
const true = 'estúpido'; // también error fatal;
// etc.
?>