Importing and aliasing an interface name is also supported.
Usar espacios de nombres: Apodar/Importar
La capacidad de referirse a un nombre completamente cualificado externo con un alias, o importar, es una característca importante de los espacios de nombres. Esto es similar a la capacidad de los sistemas de archivos basados en Unix de crear enlaces simbólicos a un archivo o directorio.
Los espacios de nombres de PHP soportan tres tipos de poner alias o importar: apodar un nombre de clase, apodar un nombre de interfaz, y apodar un nombre de espacio de nombres. Observe que importar una función o una constante no está soportado.
En PHP, apodar se lleva a cabo con el operador use. Aquí hay un ejemplo que muestra los tres tipos de importación:
Example #1 Importar/apodar con el operador use
<?php
namespace foo;
use Mi\Completo\NombreDeClase as Otra;
// esto es lo mismo que usar Mi\Completo\NombreEN as NombreEN
use Mi\Completo\NombreEN;
// importar una clase global
use ArrayObject;
$obj = new namespace\Otra; // instancia un obejto de la clase foo\Otra
$obj = new Otra; // instancia un obejto de la clase class Mi\Completo\NombreDeClase
NombreEN\suben\func(); // llama a la función Mi\Completo\NombreEN\subes\func
$a = new ArrayObject(array(1)); // instancia un obejto de la clase ArrayObject
// sin el "use ArrayObject" instanciaríamos un objeto de la clase foo\ArrayObject
?>
PHP soporta adicionalmente un atajo apropiado para poner múltiples sentencias use en la misma línea
Example #2 Importar/apodar con el operador use, múltiples sentencias use combinadas
<?php
use Mi\Completo\NombreDeClase as Otra, Mi\Completo\NombreEN;
$obj = new Otra; // instancia un objeto de la clase Mi\Completo\NombreDeClase
NombreEN\suben\func(); // llama a la función Mi\Completo\NombreEN\suben\func
?>
La importación se realiza en tiempo de compilación, y al hacerlo no afecta a los nombres de clases, funciones o constantes.
Example #3 Importar y nombres dinámicos
<?php
use Mi\Completo\NombreDeClase as Otra, Mi\Completo\NombreEN;
$obj = new Otra; // instancia un objeto de la clase Mi\Completo\NombreDeClase
$a = 'Otra';
$obj = new $a; // instancia un objeto de la clase Otra
?>
Además, la importación sólo afecta a los nombres no cualificados y cualificados. Los nombres completamente cualificados son absolutos, y no son afectados por la importación.
Example #4 Importar y nombres completamente cualificados
<?php
use Mi\Completo\NombreDeClase as Otra, Mi\Completo\NombreEN;
$obj = new Otra; // instancia un objeto de la clase Mi\Completo\NombreDeClase
$obj = new \Otra; // instancia un objeto de la clase Otra
$obj = new Otra\cosa; // instancia un objeto de la clase Mi\Completo\NombreDeClase\cosa
$obj = new \Otra\cosa; // instancia un objeto de la clase Otra\cosa
?>
Reglas de ámbito para la importación
La palabra clave use debe ser declarada en el ámbito exterior de un fichero (el ámbito global) o dentro de declaraciones de espacios de nombres. Esto es porque la importación se realiza en tiempo de compilación y no en tiempo de ejecución, por lo que no puede ser delimitada en bloque. El siguiente ejemplo mostrará un uso ilegal de la palabra clave use:
Example #5 Illegal importing rule
<?php
namespace Languages;
class Greenlandic
{
use Languages\Danish;
...
}
?>
Note:
Las reglas de importación tiene una base por fichero, lo que significa que los archivos incluidos NO heredarán las reglas de importación del padre.
Because imports happen at compile time, there's no polymorphism potential by embedding the use keyword in a conditonal.
e.g.:
<?php
if ($objType == 'canine') {
use AnimalCanine as Beast;
}
if ($objType == 'bovine') {
use AnimalBovine as Beast;
}
$oBeast = new Beast;
$oBeast->feed();
?>
The "use" keyword can not be declared inside the function or method. It should be declared as global, after the "namespace" as:
<?php
namespace mydir;
// works perfectly
use mydir/subdir/Class1 as Class1;
function fun1()
{
// Parse error: syntax error, unexpected T_USE
use mydir/subdir/Class1 as Class1;
}
class Class2
{
public function fun2()
{
// Parse error: syntax error, unexpected T_USE
use mydir/subdir/Class1 as Class1;
}
}
?>
