> Manuales > Orientación a objetos con PHP

Alternativas para importar namespaces o miembros de namespaces, con alias o sin él. Reglas para importar y cómo acceder al ámbito global para resolver nombres usados en espacios de nombres.

Este artículo continúa con la serie de tutoriales dedicados a conocer y dominar los namespaces de PHP. Es el tercero que escribimos sobre este asunto, así que te recomendamos empezar la lectura por la introducción a los namespaces de PHP.

Ten en cuenta que aquí damos por hecho que sabes ciertas cosas y además usamos código de espacios de nombres que fueron definidos en artículos anteriores.

Importar con alias

A la hora de importar código desde espacios de nombres es posible asignarles un alias para referirse a ellos más adelante. Esto nos puede servir para varias situaciones, como por ejemplo darle una manera resumida de acceder a una clase dentro de archivo o para asignarle un nombre diferente, en el caso de ya estar ocupado el nombre original de esa clase, de modo que podríamos evitar colisiones de nombres en determinadas ocasiones.

use Deswebcom\Galaxias\Andromeda\Estrella as E;

Así estaríamos asignando el Alias "E" a la clase "Estrella", que está en el namespace "Deswebcom\Galaxias\Andromeda".

A partir de ahí podríamos usar el nombre de la clase totalmente cualificado, "Deswebcom\Galaxias\Andromeda\Estrella" o el alias que acabamos de definir "E".

E::pertenece();

o bien:

Deswebcom\Galaxias\Andromeda\Estrella::pertenece();
Nota: Recuerda que también puedes declarar que vas a usar funciones o constantes de otros espacios de nombres. En ese caso la cosa cambia algo, porque tienes que mencionar "use function" o "use const".

Por ejemplo tengo este namespace.
<?php
namespace Midesweb;

function quien(){
    echo "Soy @midesweb";
}

Y en otro archivo quiero usar la función quien, también por un alias.

use function Midesweb\quien as q;

Ahora esa función está disponible con el alias "q". Luego podré invocarla así:

q();

Realmente este tema de los alias ya lo venías utilizando, aunque no lo habíamos mencionado todavía. Esto es porque cualquier sentencia "use" lo que hace realmente es crear un alias. Solamente que, si no le indicamos un alias diferente, crea ese recurso con su nombre original. Por ejemplo:

use Deswebcom\Galaxias\Andromeda\Estrella;

Es una línea de código equivalente a:

use Deswebcom\Galaxias\Andromeda\Estrella as Estrella;

Antes de acabar este punto quisiera dar dos aclaraciones, igual son cosas obvias, pero creo que podré solventar las dudas de algunos lectores:

  1. Una sentencia use con un alias (o sin él, pues realmente ya sabemos que el alias siempre lo crea al declarar un "use") pone a disposición un código tan solo para el archivo .php donde hemos creado ese alias.
  2. Esto se deriva de lo anterior: Si estás dentro de un espacio de nombres y declaras un "use" para crear un alias de una clase, función o cualquier otra cosa, no significa que estés agregando ese elemento al espacio de nombres en el que estás. Aquella función o clase, interfaz o lo que sea, permanece en el espacio de nombres donde fue definida y con ese "use" simplemente estás indicando que dentro de este fichero eres capaz de referirte a ese elemento por su alias.

Importar un namespace completo con alias

Otra tarea común es la de crear un alias para referirse a un espacio de nombres completo.

use Deswebcom\Galaxias;

Eso crea un alias llamado "Galaxias" para el namespace "Deswebcom\Galaxias".

Nota: Recuerda que es equivalente a haber escrito:
use Deswebcom\Galaxias as Galaxias;

Si dentro del namespace Deswebcom\Galaxias había una función llamada distancia(), entonces, gracias al alias, podríamos invocarla de esta manera:

Galaxias\distancia("Via Lactea", "Alfa Centauro");

Además, gracias al Alias podemos acceder también a namespaces que están dentro de Galaxias de una manera resumida.

Galaxias\Andromeda\localizar();

Aquí hemos pasado del namespace "Galaxias" al subnamespace "Andromeda" y a partir de él, invocado a su función localizar().

Podríamos crear ese namespace con un alias diferente si lo deseamos.

use Deswebcom\Galaxias as GA;

Entonces usaremos esa abreviación (alias) para acceder a los miembros del namespace.

GA\distancia("Via Lactea", "Alfa Centauro");
GA\Andromeda\localizar();

Importar solamente en el ámbito global

La instrucción use para importar un namespace o un miembro sólo se puede realizar desde el ámbito global de un fichero. Es decir, si intentamos importar desde una función nos dará un error "unexpected 'use' (T_USE)".

function importar_ilegal(){
    use Deswebcom;

    echo "Esto no lo puedes hacer, porque este no es el ámbito global";
}

Tampoco podrías hacerlo desde una clase:

class WebSite{
    use Deswebcom;
}

Pero bueno, en este caso el error sería diferente, porque aquí PHP estaría suponiendo que vas a usar un trait en la clase "WebSite" y no el namespace "Deswebcom".

Espacio de nombres global

Si estamos programando dentro de un espacio de nombres podremos crear cualquier miembro con cualquier nombre sin que colisione con otros miembros de otros namespaces. Esto ocurre con el ámbito global también.

Todas las funciones nativas de PHP están definidas dentro del ámbito global, por lo que en ocasiones podemos necesitar referirnos al ámbito global en vez del ámbito del namespace.

Por ejemplo, tengo el namespace "Deswebcom\Galaxia" y dentro de él he definido una función llamada explode(). En ese caso, dentro del namespace "Galaxia", explode() hará referencia al método expolde() que hemos definido en este ámbito.

<?php
namespace Deswebcom\Galaxias;

function explode($estrella){
    echo "La estrella $estrella va a explotar";
}

explode("Sol");

Ese código te devolverá "La estrella Sol va a explotar", porque se está invocando al explode() recién definido.

Nota: Puedes reparar que si no estuviéramos dentro de un namespace PHP no nos habría permitido crear una función llamada explode(), porque ya existe una función nativa del API de PHP con ese nombre, que se encarga en separar partes del string en un array.

Ahora bien, si necesitas por algún motivo acceder a la función explode() de PHP, la nativa definida en el ámbito global, entonces tendría que especificar que esa función es aquella del ámbito global y no la definida en el namespace. Para ello no hay más que agregarle una contrabarra antes del nombre de la función (o cualquier otra cosa del ámbito global a la que queremos acceder).

$arraymarcas = \explode("|", "desarrolloweb|escuelait");

Conclusión

Con todo esto tienes bastante información sobre namespaces. Realmente ya sabes todo lo que necesitas, así que a partir de ahora procura usarlos.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual