Php6 esta por salir y para todos aquellos que no podemos esperar su release, la gente del equipo de desarrollo de php la liberado php 5.3 el cual ya incluye los cambios que se planearon en la reunión de Paris, el 11 de Noviembre del 2005, espera!! con esto no se esta sugiriendo de ninguna forma que te muevas de inmediato a esta nueva version, aunque ya ha sido testeada por la gente de php, aun falta tiempo para que las compañias de hosting decidan moverse a php6 o incluso a este release.
Este articulo te muestra las mejoras en el lenguage , provee de codigo de jemplo y de rapido aprendizaje para aquellos que ya quieren empezar a jugar con el nuevo juguete. si deseas probar el codigo aqui mostrado tendras que descargar e instalar la version 5.3 de php de Aquì.
Empezemos.
Es todo acerca de Namespaces.
Ok, recuerdas aquellos dias en que nos emocionamos cuando la POO fue introducida en el lenguage ??, pues este es el segundo gran paso , los namespaces nos ayudaran a agrupar nuestras classes con todo el estilo de un programador POO, los namespaces son una manera en la que podemos encapsular y mantener nuestro codigo ordenado semanticamente, veamos un ejemplo.
<?php
namespace com_Insania_Instropy::Example;
class User {}
$user = new com_Insania_Instropy::Example::User();
//Notemos que el volcado de la instancia //provoca una salida nueva que no habiamos visto antes eee ñ_ñ print_r($user); ?>
Genial no, si definieramos de esta forma el nombre de nuestros namespaces queda bastante entendible sin embargo se propone la siguiente manera ..
<?php
namespace com::instropy::insania;
class User {}
$user = new com::instropy::insania::User();
?>
Asì es
, podemos definir cuantos niveles querramos, podria ser incluso
namespace mx::com::mysiteName::myApplicationName::UseCase; //ajaaa , ajjaaaa![]()
Con lo explicado hasta ahora, podriamos facilmente tener dos clases con el mismo nombre, pero en diferente namespace.
<?php
namespace com::instropy::insania;
class User {}
?>
<?php
namespace com::yoursite::yourcore;
class User {}
?>
<?php
$user1 = new com::instropy::insania::User();
$user2 = new com::yoursite::yourcore::User();
?>
”Use y ”As
Aaaa, pero ( yo se que te lo preguntas ) tengo que escribir todo el nombre del namespace para referirme a mi clase ??? , la respuesta es no, como en mayoria de los lenguajes de POO , lacreacion de una instancia viene en (minimo) dos sabores, la primera forma es especificar el namespace seguido de la clase ( esta es la forma larga ) o puedes simplemente escribir el nombre de la clase si esta ha sido importada, bueno ya que hemos visto la primera forma, la segunda seria especificar solo una vez el namespace en donde reside nuestra clase, esto se logra usando la palabra reservada use , su uso es el siguiente :
<?php use com::instropy::insania; ?> ò puedes importar una sola clase <?php use com::instropy::insania::User; ?>
Se ha señalado la facilidad de importar una clase o un namespaces, pensemos que deseamos usar dos clases con el mismo nombre pero distinto namespace, pues los chicos de php pensaron en esto y nos proporcionas la palabra reservada as , su uso es el siguiente :
<?php use com::instropy::insania as Insania_User; // use com::yoursite::yourcore as YourSite_User; // $miUser = new Insania_User(); $tuUSer = new YourSite_User(); ?>
Funciones con namespace.
Antes usabamos un prefijo para evitar sobreescribir la funcion de alguien, o incluso una propia, un ejemplo…
<?php
//supongamos que tu tienes tu archivo de funciones utiles
//que usaras en tu proyecto, la siguiente funcion regresa el
//nombre de tu proyecto.
function getProyectName(){
return defined(SITENAME) ? strtoupper(SITENAME) : "Undefined" ;
}
//pero y si tenemos un sistema de multiproyectos ?
//podriamos necesitar especificar algo mas elaborado
function getProyectName(){
//podriamos obtener el path de $REQUEST_URI hacer un split de /
// y determinar el nombre del proyecto basandonos en alguna combinacion
//...
}
?>
Pero en este caso que hacemos que funcion usamos , les cambiamos el nombre ???, no!!, la solucion es usar namespaces (ajaaaaa), su uso se especifica a continuación:
<?php
//!#lib/classes/_default.php
namespace _default;
function getProyectName() { echo 'soy getProyectName llamado desde _default'; }
getProyectName(); //
<?php
function getProyectName() { echo 'soy getProyectName bastante global'; }
require( 'lib/classes/_default.php');
_default::getProyectName(); //Se busca obtener getProyectName de _default
//de esta manera llamamos a la funcion del scope global.
getProyectName();
?>
Global Scope.
A partir de ahora deberemos acostumbrarnos a ver codigo como el siguiente:
<?php use myNamespace; $var1 = ::getTransaction(); //Llamando a getTransaction de myNamespace $var = getTransaction();// Llamando a otro getTransaction ?>
Lo anterior demuestra la convivencia de dos funciones del mismo nombre en un script, la diferencia radica en su scope,si importamos en namespace con use y deseamos usar tanto funciones de ese namespaces y las declaradas posteriormente deberemos tener en cuenta que los dos puntos especifican el namespace actual , mientras que la ausencia de estos al invocar a una funcion supone la llamada a scope global. Por ahora es todo, si bien de momento para algunos esto es nuevo,se que no tardaran mucho en dominarlo, a mi me hubiese gustado probar el character unicode en el nombre de las clases Y_______Y.
Si te gusto este articulo …
Tags: alias php, namespaces, Php 5.3, Php6


Wow…. creo qe mejor pondré un puesto de carnitas.
jejeje, me invitas….
php se supera cada dia…. esperemos q’ el dios pagano de la barbacoa nos permite vivir para verlo crecer aun más…..