Alessio Mavica PHP & MySQL Developer, Project Leader & Scrum Master

9sep/110

Namespaces en PHP 5.3

Hasta hace un par de semanas desconocía que fuera posible en PHP (>=5.3) hacer algo similar a lo que se hace en Java con los packages.

El problema que se nos presenta es lo de las name collitions o sea de la confusión que se puede producir hablando de dos cosas distintas que tienen el mismo nombre. En el caso de PHP se podría producir sobrescribiendo nombres de clases, funciones y constantes.

La solución en PHP es tan sencilla cuanto genial y se llama namespaces. Además si se utiliza en la nueva versión de Zend Framework (2.0) será algo bueno 

Oficialmente los namespaces sirven para encapsular. Ésto significa que podemos crear paquetes de clases estando seguros que no vamos a producir name collitions. Un ejemplo vale más de mil palabras:

EJEMPLO:

/*FILE file1.php*/
namespace namespace1;
class testClass {
        function whoAmI (){
                return 'file1' . PHP_EOL;
        }
}

/*FILE file2.php*/
namespace namespace2;
class testClass {
        function whoAmI() {
                return 'file2' . PHP_EOL;
        }
}

/*FILE test.php*/
require_once('./file1.php');
require_once('./file2.php');

$class1 = new \namespace1\testClass();
echo $class1->whoAmI();

$class2 = new \namespace2\testClass();
echo $class2->whoAmI();

/*********
Output:
file1
file2
*********/

Como podemos ver hemos utilizado dos clases con el mismo nombre sin generar colisiones. Lo mismo vale utilizando constantes y funciones.

VENTAJAS:

Entonces ¿cuáles son las ventajas?

1. código más claro
2. mejor organización si estamos desarrollando una aplicación muy grande
3. empezar a utilizar un nuevo elemento que será nuestro pan diario en los próximo años

SUB-NAMESPACES:

A diferencia de los packages de Java en PHP podemos crear diferentes niveles de namespace para que nuestro código resulte más organizado.

\namespace1\subnamespace\subsubnamespace

UTILIZAR UN NAMESPACE (use):

En los ejemplos anteriores hemos utilizado una barra inversa al principio del namespace. Ésto significa que el namespace que vamos a utilizar es de tipo GLOBAL. En otras palabras las rutas que utilizaremos se refieren a la root de nuestro "árbol" de namespaces. Una manera más sencilla de utilizar nuestros namespaces es definir el "nivel" que vamos a utilizar a través de la palabra reservada use.

Asumimos que tenemos la clase class1 en el siguiente namespace:

\namespace1\subnamespace\subsubnamespace

Para poder instanciarla tendríamos que utilizar este código:

$class = new \namespace1\subnamespace\subsubnamespace\class1();

Trabajando con el use podemos simplemente escribir:

use \namespace1\subnamespace\subsubnamespace;
$class = new subsubnamespace\class1();

ALIAS:

El alias es un constructo muy útil para render nuestro código más sencillo y fácil de mantener. Suponemos que en el ejemplo anterior el nombre del namespace subsubnamespace no nos guste o sea demasiado largo, podemos utilizar la siguiente sintaxis:

use \namespace1\subnamespace\subsubnamespace as newname;
$class = new newname\class1();

VARIABLE __NAMESPACE__:

Para saber en que namespace estamos actualmente podemos utilizar la variable __NAMESPACE__

CONCLUSIONES:

Este post no quiere ser una disertación completa sobre los namespaces sino mostrar una panorámica de sus capacidades.

Os dejo 3 links muy interesantes sobre este tema:

¿Te gustó este artículo?

¡Suscríbete a nuestro feed RSS!

Etiquetado con: , Deja un comentario
Comentarios (0) Trackbacks (0)

Aún no hay comentarios.


Leave a comment

(required)


6 + = quince

Aún no hay trackbacks.