Cookies

Esta web utiliza cookies para obtener datos estadísticos de la navegación de sus usuarios. Si continúas navegando consideramos que aceptas su uso.

PHP7. La nueva versión de PHP ya está aquí.

Sí señores, PHP7 ya está aquí. Solamente tienes que entrar en php.net para poder descargarlo y hacer tus pruebas con él. Y, ¿qué nos aporta esta nueva versión del lenguaje? Lo que más destaca es su mejora sustancial de rendimiento. Zend ha hecho la siguiente infografía en la cual se puede ver como anuncian una mejora del rendimiento de 2 veces más rápido!. Esto puede significar la mitad de infraestructura de servidores para tus proyectos, la mitad de tiempo de proceso. En definitiva una mejora de gran magnitud para el ecosistema PHP.

Rendimiento

Zend también publicó esta otra infografía en la cual se puede ver la mejora de rendimiento en algunas de las plataformas y frameworks PHP de mayor uso, como Magento o Drupal. En ella se puede ver como con PHP7 la cantidad de peticiones por segundo es mayor que incluso la de HHVM, el proyecto de Facebook para mejorar el rendimiento de PHP. Incluso destacan que PHP, es el más rápido de los lenguajes dinámicos en resolver un benchmark de computación intensiva, por lo que vuelve a haber un claro motivo para utilizar PHP, el rendimiento.

Novedades

Además de las mejoras en rendimiento, PHP7 incluye nuevas funcionalidades al lenguaje. El azúcar sintáctico siempre es bueno por lo que vamos a enumerar algunas de las novedades incorporadas.

Operador de nave espacial (Spaceship operator)

En primer lugar destacar el operador <=>, o como se le llama por la red, el Spaceship Operator. Este operador permite comparar tipos devolviendo lo esperado por comparadores, -1 si el primer elemento es menor al segundo, 0 si son iguales y 1 si el primer elemento es mayor que el segundo.

<?php
$a = 1;
$b = 2;

echo $a <=> $b;

No es que este operador vaya a hacer que programemos páginas web en una mañana. El único caso de uso que se me ocurre es el de funciones anónimas esperadas por funciones de ordenación, como usort.

Un lenguaje más tipado

Como siempre, PHP destaca por ser un lenguaje dinámico, pero en algunas ocasiones es útil definir que una función necesita un argumento de cierto tipo. Versiones anteriores de PHP permitían esto solamente con clases, pero no con los tipos primitivos o scalar. PHP7 nos permitirá ahora utilizar estos tipos en los argumentos de las funciones y también definir qué tipo de datos devuelve una función. Preparaos pues para un mejor autocompletado en el lenguaje en IDEs, ya que supongo que gran parte de frameworks PHP7 incluirán esta serie de funcionalidades de base.

Operador de fusión (Operador coalesce)

En mi vida como desarrollador PHP estoy seguro de la estructura de código que he tenido que escribir más veces es la siguiente.

<?php

$x = array(
/* valores que vienen
por $_POST */
);

$value = isset($x['value']) ?
    $x['value'] : null;

¿Verdad? ¿A que también lo habéis usado en infinidad de ocasiones? Para evitar el Notice que sale cuando no compruebas una clave de un array, te toca escribir todo este trozo de código. La solución que algunos le daban era utilizar el operador que anula los errores (operador arroba), algo totalmente en contra de cualquier buena práctica de programación. Es más corto, sí, pero enmascara posibles errores que no se detectarían en la aplicación.

<?php
$x = array(
/* valores que vienen
por $_POST */
);

$value = @$x['value']);

En PHP7, se ha introducido el operador de fusión u operador coalesce que nos permitirá hacer este tipo de operaciones sin comprometer la calidad de nuestro código.

<?php
$x = array(
/* valores que vienen
por $_POST */
);

$value = $x['value']) ?? null;

Declaraciones use en grupo

A partir de PHP5.3, donde se introdujo la sentencia use, por cada clase de otro espacio de nombres utilizada, se debía escribir una sentencia use. En PHP7 se incorporan las declaraciones de un grupo de sentencias use, por lo que si se incluyen distintas clases de un mismo espacio de nombres, se pueden añadir solamente en una línea.

<?php
// Antes
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as AliasClassC;

// Ahora
use some\namespace\{ClassA, ClassB, ClassC as AliasClassC};

División entera

La función intdiv nos permitirá ejecutar la división entera sin ningún tipo de trucos, como nos tocaba hacer hasta ahora.

<?php
// Antes
$a = floor(4 / 3);

// Ahora
$a = intdiv(4, 3);

Constantes con expresiones

Ahora se podrán definir constantes como resultado de una expresión.

<?php

class A
{
    const DAY_SECONDS = 24 * 60 * 60;
}

Retrocompatibilidad

Aquí es donde viene el mayor de los problemas con las versiones mayores de un lenguaje, algunas características no son retrocompatibles. Esto significa que si ya tenemos un proyecto desarrollado y no contamos con pruebas unitarias ni un procedimiento manual claro de pruebas establecido, tenemos un gran problema si lo queremos migrar a esta nueva versión mayor asegurándonos que todo funciona como se espera.

En el caso de PHP7, se ha prometido que no será un dolor migrar de las versiones PHP5 a la versión PHP7. Aún así, hay ciertos cambios a tener en cuenta.

Cambios en el manejo de excepciones

Se han introducido cambios en la jerarquía de excepciones. Ahora además de excepciones hay errores. Situaciones en las que se lanzaba un fatal error, ahora se lanzará un Error que se podrá capturar con una sentencia try/catch, ya que esta clase implementará la interfaz Throwable que será la nueva manera de capturar cualquier excepción o error.

Esto nos permitirá capturar ciertos errores que antes obligaban a parar la ejecución, o simplemente disparan un warning del cual no se podía hacer nada, como la división por cero, moviendo el lenguaje a un estilo más enfocado al manejo de excepciones.

Cambios en la sentencia foreach

Un cambio notable es el de la sentencia foreach, ya que no se comportará como antes en algunos casos. foreach tendrá dos maneras diferenciadas de trabajar en función de si se utiliza por referencia o por valor. Por valor, foreach hará una copia del array y trabajará sobre ella eliminando cualquier posibilidad de modificación del array origen. Por referencia, se permitirá que se añadan nuevos valores al array y que estos se iteren en el propio bucle. A parte de todo esto, ninguna de las dos opciones de foreach actualizará el puntero del array, es decir, si utilizamos la función current sobre el array recorrido siempre nos va a devolver el primer elemento del array. Para una explicación más detallada, puedes consultar este post sobre el nuevo foreach con ejemplos.

No se puede asignar por referencia un nuevo objeto

El resultado de un nuevo objecto creado con la sentencia new no podrá ser asignado por referencia. Este tipo de estructura de código se utilizaba mucho antes por motivos de rendimiento en versiones antiguas de PHP, por lo que si tienes código legacy o te has acostumbrado a usar esta estructura en tus aplicaciones, es buen momento para actualizar ese código.

Más cambios de compatibilidad

Estos son los cambios más importantes a mi juicio pero podéis encontrar otros como funciones eliminadas y demás en el enlace oficial o en este repositorio en Github.

PHP7 viene para quedarse

En mi opinión, es una nueva versión mayor con pocos cambios que rompan la compatibilidad, algo positivo, pero que le ha quitado alcance a un proyecto que hubiera podido mejorar considerablemente el lenguaje. También han mejorado poco los tipos básicos y funciones aportadas por el lenguaje, como por ejemplo desarrollar un tipo nativo decimal que permitiera hacer operaciones de coma fija, algo básico en otros lenguajes de alto nivel enfocados al uso general como Java o C#. De todos modos, para estar a la última, es importante ir viendo las mejoras que aporta esta nueva versión ya que más pronto o más tarde nos va a tocar hacer proyectos con él, y por las mejoras que introduce PHP7 viene para quedarse.