(PHP 5 >= 5.3.0, PHP 7, PHP 8)
La capacidad de hacer referencia a un nombre absoluto con un alias o importando un espacio de nombres es estratégica. Es un beneficio similar a los enlaces simbólicos en un sistema de archivos.
PHP puede crear alias(/importar) constantes, funciones, clases, interfaces, traits, enumeraciones y espacios de nombres.
Un alias se crea con el operador use
.
Aquí hay un ejemplo que presenta los cinco tipos de importación:
Ejemplo #1 Importación y alias con el operador use
<?php
namespace foo;
use My\Full\Classname as Another;
// Esto es lo mismo que use My\Full\NSname as NSname
use My\Full\NSname;
// importación de una clase global
use ArrayObject;
// importación de una función
use function My\Full\functionName;
// alias de una función
use function My\Full\functionName as func;
// importación de una constante
use const My\Full\CONSTANT;
$obj = new namespace\Another; // instancia un objeto de la clase foo\Another
$obj = new Another; // instancia un objeto de la clase My\Full\Classname
NSname\subns\func(); // llama a la función My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instancia un objeto de la clase ArrayObject
// Sin la instrucción "use ArrayObject" habríamos instanciado un objeto de la clase foo\ArrayObject
func(); // Llama a la función My\Full\functionName
echo CONSTANT; // muestra el valor de My\Full\CONSTANT
?>
Foo\Bar
, en comparación con
los nombres globales, como FooBar
, que no los contienen),
el antislash inicial no es necesario y no se recomienda, ya que los nombres importados
deben ser absolutos y no se resuelven relativamente al espacio de nombres actual.
Además, PHP admite atajos prácticos, como las instrucciones use múltiples.
Ejemplo #2 Importación y alias múltiples con el operador use
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instancia un objeto de la clase My\Full\Classname
NSname\subns\func(); // llama a la función My\Full\NSname\subns\func
?>
La importación se realiza durante la compilación, por lo que no afecta a las clases, funciones y constantes dinámicas.
Ejemplo #3 Importación y nombres de espacios dinámicos
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instancia un objeto de la clase My\Full\Classname
$a = 'Another';
$obj = new $a; // instancia un objeto de la clase Another
?>
Además, la importación solo afecta a los nombres sin calificación. Los nombres absolutos siguen siendo absolutos y no se modifican por una importación.
Ejemplo #4 Importación y nombres de espacios absolutos
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // instancia un objeto de la clase My\Full\Classname
$obj = new \Another; // instancia un objeto de la clase Another
$obj = new Another\untruc; // instancia un objeto de la clase My\Full\Classname\untruc
$obj = new \Another\untruc; // instancia un objeto de la clase Another\untruc
?>
La palabra clave use
debe declararse en el contexto más
externo de un archivo (el contexto global) o en las declaraciones de espacio
de nombres. Esto se debe a que la importación se realiza durante la compilación
y no durante la ejecución, por lo que no se pueden apilar los contextos. El ejemplo
siguiente muestra usos incorrectos de la palabra clave use
:
Ejemplo #5 Reglas de importación incorrectas
<?php
namespace Languages;
function toGreenlandic
{
use Languages\Danish;
// ...
}
?>
Nota:
Las reglas de importación se basan en archivos, lo que significa que los archivos incluidos no heredarán PAS las reglas de importación del archivo padre.
use
Las clases, funciones y constantes importadas desde
el mismo namespace
pueden agruparse en una
sola instrucción use
.
<?php
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// es equivalente a la siguiente declaración de grupo use
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};