PHP7

PHP 7: Algunas novedades del lenguaje

|

Sin importar si eres un desarrollador PHP con años de experiencia o simplemente administras un par de sitios basados en Wordpress, lo cierto es que todos estamos pendientes de PHP 7 y su versión final que será publicada en Noviembre de 2015.

Los cambios que existen en el lenguaje son tantos que merecen varios artículos, pero no quería dejar de comentar algunos de los que más me llamaron la atención.

Nos salteamos PHP 6 directo a PHP 7

Más de uno se preguntará que pasó con la versión 6 de PHP. Despistados hay en todas partes. Pero es cierto, la versión actual de PHP, al menos la rama estable, es 5.6. Y la siguiente será directamente la 7.

Lo que sucedió en este caso, es que ya había existido un intento anterior de convertir absolutamente todo el código de PHP a UNICODE, y este proyecto se llamó PHP 6, aunque finalmente no prosperó. Así que para evitar que la gente se confundiera el “nuevo“ PHP 6 con el “viejo“ PHP 6, es que decidieron ir directamente con el nombre PHP 7.

Es mucho (mucho) más rápido

Pero mucho más rápido. El nuevo motor de PHP 7, llamado PHPNG (si, por Next Generation, quién pensó que habría fans de Star Trek por allí), posee una performance comparable incluso con HHVM. Esto se debe a las mejoras en el uso de memorias del Zend Engine, así como a la introducción de un compilador justo-a-tiempo (JIT) en vez de realizar la compilación antes de ejecutar el código.

Esto significa, por supuesto, que una actualización a PHP 7, sin cambiar el código (y asumiendo que es automáticamente compatible), provocará que las páginas se generen el doble de rápido en promedio. Esto es una buena noticia incluso para los que tienen varios servidores configurados para servir sus aplicaciones web, ya que podrán incluso ahorrar dinero al necesitar menos hardware.

Podemos declarar los tipos de las variables.

Al menos, podemos hacerlo mucho mejor que antes. Actualmente, al recibir un parámetro, podemos indicar si es de una clase específica, interfaz, callable o array. A estos valores, ahora se agregan int, bool, float y string.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
declare(strict_types=1);

function test(int $a, string $b)
{

echo 'Deberia repetir el texto ' . $b .
' al menos ' . $a . ' veces.';
}

test(3, "PHP 7 es genial."); // Esto funciona sin problemas
test("3", "Type hinting es genial"); // Fatal Error: Uncaught TypeError: Argument 1 passed to test() must be of the type integer, string given...
?>

Además, esto no funciona solamente para los parámetros que recibimos. Ahora podemos indicar el tipo de valor que retornaremos en una función o en el método de una clase. Siguiendo el ejemplo anterior:

1
2
3
4
5
6
7
8
9
<?php
declare(strict_types=1);

function test(int $a, string $b): string
{

echo 'Deberia repetir el texto ' . $b .
' al menos ' . $a . ' veces.';
}
?>

Los tipos que podemos indicar como un posible valor de retorno, son los anteriormente mencionados string, int, bool, float, array, callable, self (para métodos de una clase sólamente), parent (para métodos también), Closure, el nombre de una clase o el de una interfaz.

Ahora todo es una Excepción

De más está decir que PHP no ofrecía uno de los mejores mecanismos para trabajar con los Errores Fatales. Ante algunos de estos errores, los métodos que definíamos para atraparlos no funcionaban, o los bloques finally (ejecutados luego de un try/catch) tampoco eran invocados.

Pero ya no más dado que PHPNG, el nuevo Zend Engine, convierte los errores fatales en Excepciones, que podemos manejar y controlar fácilmente desde el código. Para mantener la compatibilidad se ideó una nueva jerarquía de Excepciones, con la nueva Excepción principal llamada \BaseException.

BaseException (abstract)
 +- EngineException
 +- ParseException
 +- Exception
     +- ErrorException
     +- RuntimeException
         +- otras...
     +- otras...

Mi favorito: Null Coalesce Operator

Para lo último, el cambio que ya quería que se produciera, el ifsetor por excelencia con el que contamos en otros lenguajes, llega a PHP.

1
2
3
4
5
6
7
8
9
10
<?php
// Antes de PHP 7
$config = isset($config) ? $config : $this->config;

// Ahora, en PHP 7
$config = $config ?? $this->config;

// Incluso, podemos encadenarlos
$config = $config ?? $this->config ?? [];
?>

Muy pronto, en un equipo de desarrollo cerca suyo

Ya casi no tenemos que esperar nada por la nueva versión de PHP, con una fecha estimada de release para Noviembre de 2015, aunque ya podemos descargar hace tiempo las versiones Preview de Desarrollo, tanto para sistemas Unix como para sistemas Windows.

Como última recomendación, pueden descargar una máquina virtual para ser utilizada con Vagrant (si no saben que es Vagrant, me lo hacen saber en los comentarios y escribo un artículo al respecto), creada por Rasmus Lerdorf preparada ya con la última versión de PHP7. De esta manera, pueden correr sus tests y confirmar si su código ya está listo para ser ejecutado en PHP 7.

Esta es una brevísima introducción. Si están interesados en más detalles, estoy preparando una versión extendida explicando paso a paso todas las novedades del lenguaje en varias partes. Nos leemos en los comentarios.