Artículo introductorio a PHP5, en el cual se exponen las nuevas características y ventajas que PHP5 presenta sobre PHP4; además de nuevas extesniones útiles.
PHP5 se deriva de la demanda de los consumidores por un lenguaje de programación Web orientado a objetos. Sin embargo, la programación orientada a objetos no es nueva en el lenguaje de PHP, sin embargo con la llegada de PHP5, la programación OO (Orientada a Objetos) se vuelve ahora más sencilla. PHP5 introduce nuevos métodos y funciones propias para hacerle la vida al programador mucho más cómoda. En este artículo leerán lo nuevo que trae PHP5.
» Características del Lenguaje
Modelo Orientado a Objetos
La sintaxis del modelo orientado a objeto existe dentro de PHP desde la versión 3. El modelo OO te permitía la posibilidad de crear herencias y permitía crear clases y objetos para agregar propiedades y métodos. Pero no permitía mucho más. Aunque el modelo OO tenía serias limitaciones, esto no evito que fuese ampliamente utilizado alrededor del mundo. Al escribir PHP4 el modelo OO no fue muy trabajado, y por ende aún se sentían limitaciones al programar OO.
La programación OO es el principal foco de PHP5, y por el cual este ha ganado gran aceptación entre los desarrolladores de aplicaciones Web. Gracias a que PHP5 es intuitivo, la infraestructura del modelo OO fue rescrita para trabajar con el manejo de objetos. A menos que explícitamente clones un objeto utilizando la palabra clave clone, nunca se crearán duplicados de los objetos. En PHP5 no hay que pasar objetos por referencia o asignarlos por referencia.
Nuevas Características OO
public/private/protected: modificadores de acceso para métodos y propiedades. Permite el uso de modificadores de acceso OO comunes para controlar los accesos a métodos y propiedades:
Codigo:
1 2 3 4 5 6 7 8
|
<?php
class miClase {
private $id = 18;
public function buscarId() {
return $this->id;
}
}?>
|
Nombre de constructor unificado __construct().
En vez del constructor ser el nombre de una clase, ahora es declarado como
__construct(), el cual permite que sea más fácil cambiar clases dentro de jerarquías de clases:
Codigo:
1 2 3 4 5 6
|
<?php
class miClase {
function __construct() {
print “Dentro del constructor”;
}
}?>
|
Soporte para destruir objetos al definir el método __destructor().
Permite definir una función que se ejecuta cuando se destruye un objeto:
Codigo:
1 2 3 4 5 6
|
<?php
class miClase {
funciton __destruct() {
print “Destruyendo objeto”;
}
}?>
|
Interfaces.
Le de la habilidad a un clase para sobrellevar mas de un relación
is-a. Una clase sólo puede heredar de una clase, pero se puede implementar en cuantas interfases se desee:
Codigo:
1 2 3 4 5 6 7 8 9
|
<?php
interface Desplegar {
function desplegar();
}
class Circulo implements Desplegar {
function desplegar() {
print “Desplegando círculon”;
}
}?>
|
El operador instanceof.
Soporte a nivel de lenguaje para verificar una relación
is-a. La función
is_a() de PHP4 es ahora despreciada:
Codigo:
1 2 3 4
|
<?php
if ($obj instanceof Circulo) {
print “$obj es un círculon”;
}?>
|
Métodos Finales.
La palabra clave
final permite marcar métodos de manera que las clases herederas no lo puedan sobrecargar:
Codigo:
1 2 3 4 5 6
|
<?php
class miClase {
final function nombreClaseBase() {
return __CLASS__;
}
}?>
|
Clases Finales.
Después de declarar una clase como
final, esta no puede ser heredada. El siguiente ejemplo crearía un error:
Codigo:
1 2 3 4 5 6
|
<?php
final class ClaseFinal {
}
class ClaseErronea extends ClaseFinal {
}?>
|
Clonación Explicíta.
Para clonar un objeto hay que utilizar la palabra clave clone. Se puede declarar un método
__clone(), el cual será llamado durante el proceso de clonación (después de que las propiedades hayan sido copiadas del objeto original):
Codigo:
1 2 3 4 5 6 7 8
|
<?php
class miClase {
function __clone() {
print “El objeto esta siendo clonado”;
}
}
$obj = new miClase();
$obj_copia = clone $obj;?>
|
Clases constantes.
Las definiciones de clases ahora pueden incluir valores contantes y son referenciados utilizando la clase:
Codigo:
1 2 3 4 5 6
|
<?php
class miClase {
const EXITO = “Éxito”;
const FALLO = “Fallo”;
}
print miClase::ÉXITO;?>
|
Métodos Estáticos.
Ahora puedes definir métodos estáticos al permitirles se llamados desde contextos de no-objetos. Los métodos estáticos no definen la variable
$this porque no estan atados a ningún objeto en específico:
Codigo:
1 2 3 4 5 6 7
|
<?php
class miClase {
static function holaMundo() {
print “Hola, mundo”;
}
}
miClase::holaMundo();?>
|
Miembros Estáticos.
Las definiciones de clase ahora pueden incluir miembros (propiedades) estáticas que son accesibles a través de la clase. Uso común de miembros estáticos se ve en el patrón
Singleton:
Codigo:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?php
class Singleton {
static private $instancia = NULL;
private function __construct() {
}
Static public function obtenerInstancia() {
if (self::$instancia == NULL) {
self::$instancia = new Singleton();
}
}
}?>
|
Clases Abstractas.
Una clase puede ser declarada
abstract para prevenir que esta sea instanciada. Sin embargo, se puede heredar de una clase abstracta:
Codigo:
1 2 3 4 5 6
|
<?php
abstract class miClaseBase {
function desplegar() {
print “Rutina de desplegar siendo llamada”;
}
}?>
|
Métodos Abstractos.
Un método puede ser declarado
abstract, y por lo tanto diferir su definición a una clase heredera. Una clase que incluye métodos abstractos debe ser declarada
abstract:
Codigo:
1 2 3 4
|
<?php
abstract class miClaseBase {
abstract function desplegar();
}?>
|
Especificación de Tipo de Clase
Las funciones declaradas pueden incluir especificaciones del tipo de clase para su parametrización. Si las funciones son llamadas con un tipo de clase incorrecto, retornara un error:
Codigo:
1 2 3
|
<?php
function expectsMiClase(MiClase $obj) {
}?>
|
Soporte para desasociar objetos que son devueltos de métodos.
En PHP4, no se podía desasociar objetos que eran devueltos de métodos. Para ello, primero había que asignar un objeto a una variable simulada y luego desasociarla.
PHP4:
Codigo:
1 2 3
|
<?php
$simulada = $obj->metodo();
$simulada->metodo2();?>
|
PHP5:
Codigo:
1 2
|
<?php
$obj->metodo()->metodo2();?>
|
Iteraciónes.
PHP5 permite implementar interfaces de
iterator (iteración) utilizando clases de PHP y clases de extensiones de PHP. Después de implementar esta interfaz, puedes iterar instancias de la clases utilizando el constructor de lenguaje
foreach():
Codigo:
1 2 3 4 5
|
<?php
$obj = new MiIteradorImplementado();
foreach ($obj as $valor) {
print “$valor”;
}?>
|
__autoload().
Muchos programadores que programan aplicaciones OO crean archivos PHP que contienen clases definidas. Uno de los problemas más molestosos es tener que escribir una larga lista de inclusiones (
include) al principio de cada archivo para asi poder utilizar las clases que queramos. Si defines una función
__autoload() esto será más sencillo, ya que cada vez que trates de usar una clase que no ha sido definida esta función será llamada. Al llamar esta función el motor de scripting te da por lo menos una oportunidad de llamar una clase antes de que PHP te de un error:
Codigo:
1 2 3 4 5 6 7
|
<?php
function __autoload($nombreClase) {
incluye_once($nombreClase . “php”);
}
$obj = new MiClase1();
$obj2 = new MiClase2();?>
|
Otras Características Nuevas
Manejo de Excepciones
PHP5 añade la habilidad de utilizar el paradigma de los manejos de excepciones
try/throw/catch. Sólo es permitido tirar objetos que son heredados de la clase
Exception:
Codigo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
<?php
class SQLException extends Exception {
public $problema;
function __construct($problema) {
$this->problema = $problema;
}
}
try {
...
throw new SQLException(“No se estableció comunicación con la DB”);
...
} catch (SQLException $e) {
print “Se detecto una excepción SQL con el problema $obj->problema”;
} catch (Exception $e) {
print “No se reconoce la excepción”;
}?>
|
foreach con referencias
En PHP4 no se podía iterar a través de un arreglo y modificar sus valores. PHP5 soporta esto al permitir marcar el bucle
foreach() con el signo de referencia (
& ), el cual hace cualquier valor que cambies afecte el arreglo por el cual estas iterando:
Codigo:
1 2 3 4 5 6
|
<?php
foreach ($arreglo as &$valor) {
if ($valor === “NULL”) {
$valor = NULL;
}
}?>
|
Valores por defecto de parámetros por referencia.
En PHP4, los valores por defecto sólo podían ser asignados parámetros, los cuales son valores traspasados. PHP5 puede asignar valores por defecto a parámetros por referencia:
Codigo:
1 2 3 4 5 6
|
<?php
function mi_func(&$arg = null) {
if ($arg === NULL) {
print ‘$arg esta vacio’;
}
}?>
|
» Cambios General de PHP
XML y Servicios de Web (Web Services)
Siguiendo los cambios en el lenguaje, las actualizaciones de XML en PHP5 son probablemente el más significante e emocionante. La funcionalidad incrementada de XML en PHP5 lo pone a la par con otras tecnologías Web y las sobre pasa en otros aspectos.
La Fundación
El soporte de XML en PHP4 fue implementado mediante el uso de librerías subyacentes. El soporte a SAX fue implementado utilizando la vieja librería Expat. XSLT fue implementado utilizando la librería Sablotron (o utilizando la librería libxml2 a través de la extensión del DOM), y el DOM fue implementado utilizando la librería libxml2 del proyecto GNOME.
Utilizando una variedad de librerías no hizo que PHP4 sobresaliera en cuanto al soporte de XML. El mantenimiento era pobre, los nuevo estándares de XML no eran siempre soportados, el rendimiento no era tan bueno como podía ser, y la interoperabilidad entre los diferentes XML no existía.
En PHP5, todas las extensiones de XML han sido rescritas para utilizar la caja de herramientas de XML: libxml2 (
xmlsoft.org). Es una librería rica en características, altamente mantenida, y con implementación eficiente de los estándares de XML; y le da la ventaja a PHP en cuanto a la tecnología XML.
Todas las ya mencionada extensiones (SAX, DOM, y XSLT) ahora utilizan libxml2, incluyendo las nuevas extensiones SimpleXML y SOAP.
SAX
Como mencionado anteriormente, la nueva implementación de SAX ha cambiado de Expat a libxml2. Aunque la nueva extensión debe de ser compatible, algunas pequeñas diferencias pueden existir. Los desarrolladores que quieran trabajar con la librería Expat aún lo pueden hacer configurando y compilando PHP adecuadamente (no recomendado).
DOM
Aunque el soporte de DOM en PHP4 estaba basado en la librería libxml2, esta tenía errores, escapes de memoria, y en muchos casos, el API no era obediente con los estándares de la W3C. La extensión del DOM pasó por un reajuste para PHP5. No sólo la extensión fue rescrita, sino que también es obediente con la W3C. Además de esto, la extensión del DOM ahora soporta tres tipos de esquemas para XML: DTD, esquema del XML y RelaxNG.
Como resultado de estos cambios, cualquier código de PHP4 que utilice el DOM no siempre se ejecutará en PHP5. Sin embargo, en muchos casos, ajustando los nombres de las funciones al nuevo estándar funciona el la mayoría de los casos.
XSLT
En PHP4 hay dos extensiones que soportan las XSL Transformations (Transformaciones XSL): la extensión Sablotron y el soporte para XSLT en la extensión del DOM. PHP5 cuenta con una nueva extensión de XSL, y como anteriormente mencionado, esta no toma la hoja de estilo (stylesheet) XSLT como parámetro, si no que depende de la extensión del DOM para cargarlo. La hoja de estilo puede ser cacheada en memoria y puede ser aplicada a mucho documentos ahorrando así mucho tiempo de procesamiento.
SimpleXML
En vez de tener que bregar con DOM o, peor aún, con SAX, SimpleXML representa tu archivo XML como un objeto nativo de PHP. Puedes leerlo, sobre escribirlo o iterarlo con facilidad, teniendo acceso a elementos y atributos.
Codigo:
1 2 3 4 5 6 7 8 9 10 11
|
<?php
<clientes>
<cliente>
<nombre>Juan Aliz</nombre>
<no_cuenta>87234838</no_cuenta>
</cliente>
<cliente>
<nombre>Sofía López</nombre>
<no_cuenta>72384329</no_cuenta>
</cliente>
</clientes>?>
|
El siguiente código imprime el nombre de cada cliente y su número de cuenta:
Codigo:
1 2 3 4 5
|
<?php
$cliente = simplexml_load_file(‘cliente.xml’);
foreach ($cliente->cliente as $cliente) {
print “$cliente->nombre tiene la cuenta #$cliente->no_cuentan”;
}?>
|
Es obvio cuan simple SimpleXML es.
SOAP
PHP4 no tenía soporte oficial para SOAP. Las implementación más comúnmente utilizada de SOAP es PEARs, pero como estaba implementada por completo en PHP, esta no podía trabajar bien como otras extensiones de C incorporadas. Otras extensiones de C no obtuvieron popularidad ni uso común y por lo tanto fueron descartadas en la distribución principal de PHP5.
El soporte de SOAP en PHP5 viene por parte de la extensión en C completamente rescrita, y aunque fue completada en la última etapa del proceso beta, fue incorporada en la distribución principal.
Nueva extensión MySQLi (MySQL Improved)
Para PHP5, MySQL AB (
mysql.com) ha escrito una nueva extensión de MySQL que te permite tomar ventaja de la nueva funcionalidad de MySQL 4.1+. Al contrario de la vieja extensión de MySQL, la nueva proporciona una interfaz funcional y una interfaz OO. Nuevas características de esta extensión incluye: declaraciones preparadas y posibilidad de atar variables, SSL y conexiones comprimidas, control de transacciones, soporte para replicación y más.
Extensión SQLite
Soporte para SQLite (
sqlite.org) fue introducido en PHP4.3.x por primera vez. Es una librería SQL que no necesita un servidor SQL, así que es adecuada para aplicaciones que no requieren la escalabilidad de los servidores SQL o, si tienes un ISP que no permite acceso a servidores SQL. Contrario a su nombre, SQLite tiene muchas características y soporta transacciones, sub-selecciones, vistas y archivos de base de datos amplias. Es mencionada aquí como una característica de PHP5 porque fue introducida muy tarde en la serie de PHP4 y porque toma ventaja de PHP5 proveyendo una interfaz OO y soportando iteradotes.
Extensión Tidy
PHP5 incluye soporte para la útil librería Tidy (
tidy.sf.net). Tidy le permite a los desarrolladores de PHP analizar, diagnosticar, limpiar y reparar documentos HTML. La extensión Tidy soporta una interfaz funcional y una interfaz OO, y su API utiliza el mecanismo de excepciones de PHP5.
Extensión Perl
Aunque no viene incorporada en PHP5 por defecto, la extensión de Perl permite llamar scripts de Perl, objetos de Perl, y utilizar otras funcionalidades de Perl nativamente dentro de PHP. La extensión se encuentra dentro del PECL (PHP Extension Community Library) en
pecl.php.net .
» Otras Nuevas Características en PHP5
Nuevo Manejador de Memoria
El motor de Zend tiene un nuevo manejador de memoria. Las dos ventajas principales son un mejor soporte para entornos multi-threading (las asignaciones no necesitan hacer ninguna cerradura mutua de excepciones), y después de cada petición, la liberación de los bloques de memoria asignados es llevado a cabo más eficientemente.
Soporte Descontinuado para Windows 95
Correr PHP5 en la plataforma Windows 95 no es soportado debido a que Windows 95 no soporta la funcionalidad que PHP5 ofrece. Debido a que Microsoft oficialmente detuvo el soporte de PHP para Windows 95 en el 2002, la comunidad PHP decidió que descontinuar el soporte fue una sabia decisión.