El nuevo PHP

Aunque por mucho tiempo PHP ha sido considerado el patito feo de los lenguajes de programación, lo cierto es que desde que hace aproximadamente un año pudimos confirmar la sospecha de que es por lejos el lenguaje más popular en la web: según cifras de Google, se trata del lenguaje que está tras el 75% de la web.

Pero esta cifra no es la única buena noticia para quienes utilizamos este lenguaje, ya existen varias señales ligadas a su desarrollo y utilización que auguran un futuro cada vez más brillante, al punto que en varios medios se habla del renacer de PHP.

Las mejoras en el lenguaje

En primer lugar cabe mencionar el ritmo incesante de mejoras que se han introducido en el lenguaje desde hace ya varias versiones.

Es cierto que en su versión 4 el modelo de objetos era un parto, pero desde eso ya han pasado 10 años, lo que en tiempo de internet equivale aproximadamente a dos glaciaciones.

Desde la versión 5.3 (publicada hace 5 años) ya existe un soporte completo para funcionalidades tremendamente útiles como namespaces, late static bindings, closures y funciones anónimas. Posteriormente se han agregado otras como traits, generators, sintaxis abreviada para arreglos y el servidor de desarrollo incorporado.

Más allá de poder equiparar las funcionalidades del lenguaje con otros considerados “más serios” o avanzados, lo que resulta verdaderamente importante de estas adiciones es que, en primer lugar, permiten un modelo de objetos realmente completo y acabado, lo que a su vez permite abordar problemas más complejos con menos complejidad en el código e incorporar pequeñas grandes mejoras en la forma de utilizar el lenguaje como el uso de autoloaders. De este modo, propician la utilización de patrones de diseño que constituyen una ayuda importante para pensar la arquitectura de una aplicación desde estrategias validadas como buenas prácticas.

Las nuevas librerías y extensiones

Además de las funcionalidades propias del lenguaje, la introducción de algunas librerías y extensiones ha representado mejoras clave para el trabajo con PHP.

SPL (Standard PHP Library)

Es una “colección de interfaces y clases que están pensadas para solucionar problemas comunes”, lo que quizás inicialmente no suena tan sexy pero al comenzar a utilizarlas comienzan a revelar sus bondades.

Un ejemplo muy sencillo puede ser la interfaz Countable, que permite llamar la función count() sobre un objeto:

class Team implements Countable{
	private $people;
	public function __construct ( array $people ){
		$this->people = $people;
	}
	public function count(){
		return count( $this->people );
	}
}

$front = new Team(['Paola', 'Hugo', 'Basilio', 'Felipe']);
$members = count( $front );
// $members = 4;

Pero donde SPL realmente resulta brillante es en la implementación de las interfaces Traversable e Iterator, que básicamente van a permitir recorrer una colección de objetos con un simple foreach — lo que, por ejemplo, te podría servir para simplificar la forma en que recorres un loop de posts en WordPress.

SPL trae un montón de iteradores predefinidos para una amplia variedad de usos, como directorios o sistemas de archivos, arreglos, arreglos recursivos, etc.

PHP-FPM

Anteriormente, uno de los contratiempos que había que sortear al intentar utilizar un servidor distinto de Apache era la forma de gestionar los procesos de PHP como FastCGI, lo que normalmente significaba inventar la rueda con algún script en bash, cronjobs, etc.

Ahora, toda esa gestión se puede hacer con PHP-FPM, y en lugar de tener que averiguar cómo levantar y mantener arriba los procesos, sólo debes indicar algunos valores de configuración y ejecutar PHP-FPM como servicio.

OPcache

Como PHP es un lenguaje interpretado, cada vez que se ejecuta un script el intérprete debe leer y compilar el código, a menos que cuentes con un bytecode cache que precompila el código en memoria, lo que ahorra un gran esfuerzo de procesamiento.

El módulo de OPcode hace precisamente esto. Antes era posible aplicar esta técnica con algunas extensiones como APC o XCache, pero desde la versión 5.5 de PHP esta extensión es parte de la distribución estándar, lo que significa una mejora significativa de performance.

Por otra parte, la inclusión de esta extensión ha dado impulso a una búsqueda renovada de mejoras de performance, lo que tiene que ver con otros de los puntos que nombro a continuación.

Los estándares

Hace un par de años, los autores de algunos de los frameworks más importantes comenzaron a coordinar un grupo de trabajo en torno a problemas comunes, lo que los gringos llaman finding common ground.

A partir de este acuerdo nació PHP – Framework Interop Group, y a partir de entonces sus acuerdos han dado lugar a una serie de estándares que apuntan fundamentalmente a mejorar la interoperabilidad entre los distintos proyectos, tales como una convención para permitir código plug-and-play (a través de un autoloader), interoperabilidad técnica, una guía de estilo, etc.

En la práctica, esto ha permitido la utilización de distintos paquetes como módulos, por lo que cada proyecto puede dedicarse a aquello con lo que pretende distinguirse mientras que las funcionalidades base son provistas por los módulos de terceros.

Junto con esto, hace sólo algunos días tuvimos la interesante noticia de que el equipo de HHVM publicó un primer borrador para una especificación de lenguaje para PHP, lo que cobra especial relevancia ante el surgimiento de nuevas implementaciones paralelas o más experimentales del lenguaje… tal como, justamente la que hace el equipo de HHVM — más sobre esto más adelante.

Los componentes

Si tuviéramos que juzgar el trabajo de PHP-FIG por sus resultados, uno de sus efectos más profundos ya basta para percatarnos de su relevancia.

La publicación de estándares de interoperabilidad ha preparado el terreno para el surgimiento de Composer, que no ciertamente no es el primer gestor de paquetes para PHP (ya antes existían PECL y PEAR) pero quizás si sea el primero que se define como un gestor de dependencias.

Composer posibilita trabajar de forma muy fácil e inteligente con componentes desarrollados por diversos equipos, y así poder aprovechar los mejores paquetes de cada uno de ellos (o los que más te gusten por su estilo, documentación, comunidad, etc).

Esto disminuye la barrera a la reutilización de código de otros proyectos, y de ese modo no necesitas tener que crear una nueva clase para validar datos de formulario sino elegir entre las muchas que ya existen, y así enfocarte en lo que tu aplicación necesita resolver.

Los servicios

Quizás uno de los impulsos más importantes que ha recibido PHP fue el anuncio de Google sobre su soporte en Google App Engine; no solamente por las cifras de uso del lenguaje sino también porque pone al lenguaje en el mismo plano que otros lenguajes tradicionalmente considerados más “serios”.

Por otra parte, han sido los servicios que permiten aprovechar todas las ventajas de la nube en aplicaciones en PHP, no solamente a nivel de infraestructura-como-servicio sino ya en plataforma-como-servicio, tales como EngineYard, Heroku, Pagoda Box, cloudControl, fortrabbit, etc.

Mención aparte merece Laravel Forge, que en lugar de ofrecer directamente un servicio de hosting, permite gestionar y “orquestar” los recursos de varios proveedores de servicios, tales como Amazon, Rackspace, Digital Ocean y Linode.

Finalmente, cabe mencionar también la gama de hosting especializado en WordPress (que es por lejos, la aplicación en PHP más popular) que han comenzado a multiplicarse y representan una alternativa intermedia entre las posibilidades y complicaciones que da tener tu propio hosting y el grado de gestión y restricciones que tiene algo como WordPress.com (por ejemplo: wpEngine, Synthesis, Kinsta, etc).

El futuro

Para terminar, tres anotaciones sobre cuestiones que aún están en desarrollo y ciertamente van a marcar el futuro de PHP.

Normalización de la librería estándar

En primer lugar, siguiendo con las modificaciones al lenguaje, se ha planteado la posibilidad de poder ordenar profundamente la librería de funciones estándar para mejorar en tres flancos:

  • Reducir la cantidad de funciones definidas en el espacio de nombres global
  • Normalizar los nombres de funciones de acuerdo a un criterio común
  • Eliminar discordancias en orden de argumentos en funciones similares

Una de las propuestas más interesantes en este sentido es transformar los conjuntos de funciones según el tipo de dato en el que trabajan, por ejemplo:

// actualmente
$foo = ['lorem', 'ipsum', 'dolor', '', 'sit', 'amet'];
$filtered = array_filter( $foo );
// $filtered = ['lorem', 'ipsum', 'dolor', 'sit', 'amet'];
$uppercase = array_map('strtoupper', $filtered);
// $uppercase = ['LOREM', 'IPSUM', 'DOLOR', 'SIT', 'AMET'];

// las nuevas versiones harían algo como...
$foo = new Array('lorem', 'ipsum', 'dolor', '', 'sit', 'amet');
$filtered = $foo->filter();
$uppercase = $foo->map('strtoupper');

HHVM, Hack y PHP-NG

Probablemente el proyecto más grande realizado en PHP es Facebook, por ello es que hace años la empresa ha venido haciendo algunos aportes al desarrollo del lenguaje que ciertamente son relevantes.

Primero fue HipHop for PHP, que tomaba código en PHP y lo compilaba en C++ con una mejora de performance considerable, pero que ciertamente se encontraba con algunas limitaciones propias del proceso, particularmente de compatibilidad.

Luego vino HHVM, que es una máquina virtual que compila código en PHP y mediante compilación Just-in-Time (JIT) logra acelerar la ejecución de la aplicación — algo similar, aunque no exactamente lo mismo, a lo que se logra con un bytecode cache.

HHVM tiene como misión poder ejecutar de forma transparente los 20 frameworks en PHP más populares según GitHub, por lo que la compatibilidad es ciertamente una de sus objetivos de diseño más importantes, pero además permite la ejecución de código escrito en Hack, que es un lenguaje derivado de PHP desarrollado por Facebook.

Ante estos desarrollos, el grupo de desarrollo de PHP ha trabajado en una nueva versión del lenguaje temporalmente llamada PHP-NG (por “new generation”) que considera importantes mejoras de performance y prepara el camino para el desarrollo posterior de un compilador JIT.

Los resultados de estos esfuerzos son bastante prometedores en términos de performance, y los primeros benchmarks que comparan estos proyectos ya reportan mejoras significativas.

¿PHP 6 o 7?

Para finalizar un dato más bien anecdótico, que se refiere a la discusión sobre el nombre de la nueva versión mayor de PHP.

Normalmente no habría ninguna discusión respecto a que tras la versión 5 debiese venir la versión 6, pero en el caso de PHP las cosas no son tan sencillas.

La razón es que a pesar de no haber sido publicada oficialmente, sí existe (o existió) una versión 6, que como principal característica traía un soporte nativo completo de Unicode, pero por diversas dificultades este desarrollo naufragó, y muchas de las nuevas funcionalidades del lenguaje que traía esta versión fueron incorporadas a la versión 5.3 (razón por la cual el modelo de objetos tuvo un salto cualitativo en esa versión)… con la excepción del soporte Unicode, por supuesto.

Y aunque esa versión nunca se liberó, técnicamente sí existe e incluso se pueden encontrar algunas publicaciones al respecto.

Finalmente, tras una votación se ha decidido que la próxima versión de PHP sea la número 7, basada en el trabajo desarrollado en PHP-NG.

Más referencias…

Puedes leer más en: