Novedades y cambios en PHP 5.6

La última versión de PHP ha sido lanzada oficialmente el 28 de agosto de 2014, tras un rodaje de casi 5 meses tenemos disponible la versión 5.6.5 lanzada el 22 de enero de 2015. Como ya es momento de empezar a pensar en actualizar nuestros sistemas, voy a hacer un pequeño repaso de los últimos cambios y novedades que trae consigo esta versión.

En lo primero que vamos a centrarnos es en los cambios que no son compatibles con versiones anteriores:

  • Las claves de un array no serán sobrescritas al definir un array como propiedad de una clase mediante un literal de array
  • Rigurosidad de json_decode(). Según la especificación de JSON, los literates de true, false y null deberían estar en minúscula, a partir de esta versión se rechazarán el resto de variantes
  • Las envolturas de flujos ahora verifican de manera predeterminada los certificados del mismo nivel y los nombres de host al usar SSL/TLS
  • Los recursos GMP ahora son objetos
  • Las funciones de Mcrypt ahora requieren claves e IV válidos

Tenéis más información sobre estos cambios en la documentación de php dedicada los cambios con incompatibilidades.

Y ahora la parte más interesante, al menos para mi, las nuevas características de PHP 5.6.

Expresiones escalares constantes: En una declaración de propiedad o en los argumentos predeterminados de una función, donde antes solo se admitía un valor estático, ahora se puede proporcionar una expresión escalar con literales numéricos, de cadena o constantes.

<?php

public function f($a = UNO + self::TRES) {}

?>

Funciones variádicas mediante “…” : Las funciones variádicas (lista de argumentos de longitud variable) se pueden implementar utilizando el operador … (tres puntos), sin necesidad de func_get_args().

<?php

function suma(...$param)
{
    //$param es un array con los argumentos proporcionados
    return array_sum($param);
}

echo suma(1, 3, 5); //retorna 9
echo suma(10, 10, 10, 10, 10); //retorna 50

?>

Desempaquetar argumentos mediante “…” : En otros lenguajes como Ruby esto se conoce como operador “splat” y con él se pueden desempaquetar arrays o objetos traversable en listas de argumentos para llamadas a funciones.

<?php

function concatena($prefijo, $lexema, $sufijo)
{
    return $prefijo.$lexema.$sufijo;
}

$a = array('DES', 'ESPERA', 'CIÓN');
echo concatena(...$a); //muestra DESESPERACIÓN

?>

Exponenciación mediante **: Se agrega un nuevo operador asociativo (**) para realizar la exponenciación, junto con el operador abreviado **=

<?php

echo 2 ** 3; //Muestra 8
$a = 3;
$a **= 2;
echo $a; //Muestra 9

?>

Ampliación del operador use: Se ha ampliado el uso de “use” para admitir la importación, además de clases, de funciones y constantes, mediante los constructores use function y use const.

<?php

namespace Mi\Espacio {
    const UNO = 1;
    function dos() { return "Function dos"; }
}

namespace {
    use const Mi\Espacio\UNO;
    use function Mi\Espacio\dos;
    
    echo UNO; //Muestra 1
    echo dos(); //Muestra Function dos
}

?>

phpdbg: Depurador interactivo implementado como un módulo de SAPI. Permite un completo control sobre el entorno sin impacto en la funcionalidad o el rendimiento del código.

Codificacion de caracteres predeterminada: default_charset se emplea como conjunto de caracteres predeterminados para las funciones htmlentities(), html_entity_decode() y htmlspecialchars(). El valor predeterminado es UTF-8

php://input reutilizable: php://input puede ser reutilizado tantes veces como sea necesario.

Ficheros grandes: Ahora se pueden subir ficheros de más de 2 GB

GMP soporta sobrecarga de operadores: Los objetos GMP (números enteros de longitud arbitraria usando la biblioteca MP de GNU) soportan la sobrecarga de operadores y la conversión a tipos escalares, lo que facilita la lectura del código.

<?php

$a = gmp_init(42);
$b = gmp_init(17);

echo $a + $b; //Muestra 59

?>

hash_equals() con seguridad contra ataques de temporización: Comparación de strings en tiempo constante, evitando así ataques por temporización, por ejemplo al comparar los hash de contraseñas de crypt(), asumiendo que no se puede usar password_hash() y password_verify().

Método mágico __debugInfo(): Con este método se pueden modificar las propiedades y los valores que se muestran cuando el objeto se imprime utilizando var_dump()

<?php

class Uno
{
        private $uno;

        public function __construct($uno)
        {
                $this->uno = $uno;
        }

        public function __debugInfo()
        {
                return ['propiedad' => $this->uno];
        }
}

$a = new Uno(10);

var_dump($a); //Muestra: object(Uno)#1 (1) { ["propiedad"] => int(10) }

?>

Algoritmo de hash gost-crypto: implementa la función de hash GOST empleando las tablas CryptoPro S-box

Mejoras en SSL/TLS: Mejoras en el soporte de SSL/TLS, incluyendo la habilitación de la verificación del par por omisión, soporte para la comparación de huellas digitales de certificados, mitigación de ataques de negociado TLS y mayor control en los ajustes de protocolos y verificaciones.

Soporte para pgsql asíncrono: La extensión pgsql admite conexiones y consultas asíncronas. Las conexiones asíncronas podrían esteblecerse mediante la constante PGSQL_CONNECT_ASYNC, y se podrían emplear las nuevas funciones pg_connect_poll(), pg_socket(), pg_consume_input() y pg_flush() para manejar conexiones y consultas asíncronas.

<?php

$db = pg_connect($conn_str, PGSQL_CONNECT_ASYNC);

?>