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);

?>

Yum: resolver el error «rpmdb open failed»

Tras intentar hacer alguna operación con yum en consola nos encontramos con el error «rpmdb open failed».

Este error indica que las bases de datos que se encuentran bajo el directorio /var/lib/rpm( están dañadas. Su formato de nombre de fichero es del tipo «_db*», así que para deshacernos de este problema nada más sencillo que borrarlas y volver a crearlas.

Como root ejecutamos el borrado de las bases de datos, las regeneramos, limpiamos la cache y la volvemos a crear.

$
$ rm -f /var/lib/rpm/_db*
$ rpm -vv --rebuilddb 
$ yum clean all
$ yum makecache 
$

PHP 5.6 deja de ser beta

El equipo de desarrollo de PHP ha anunciado el lanzamiento de la primera release candidate, PHP 5.6.0RC1, por el momento no se recomienda su uso en entornos de producción, pero es importante revisar las novedades y cambios que trae para ir preparando nuestras aplicaciones.

Entre esta relase candidate y su predecesora en beta se ha añadido soporte en mysqlnd para MySQL 5.7 y se han solucionado algunos errores.

Entre las novedades más destacadas que llegan con PHP 5.6 está:

  • incorporación de un debbuger interactivo (phpdbg)
  • reutilización del flujo de lectura de php://input
  • soporte para ficheros de más de 2GB
  • inclusión del operador … (tres puntos) que permite la variación del número de argumentos en las funciones y el desempaquetado de arrays y objetos con interface travesable de forma similar a como se hace en Ruby
  • soporte para potenciación a través del operador **
  • mejoras en SSL/TLS y soporte para el algoritmo GOST

Warning: Creating default object from empty value

El titulo muestra el mensaje que despliega PHP cuando se intenta manejar una variable como si fuese un objeto (por ejemplo cuando sobre una variable vacía intentamos asignar valor a una propiedad).

<?php

$usuario->nombre = 'Salvador';
$usuario->apellido = 'Mendez';

?>

Hasta PHP 5.4 los mensajes E_STRICT no estaban incluidos en E_ALL, por lo que el código anterior no mostraba ningún tipo de error en la mayoría de configuraciones de servidores PHP. Pero a partir de 5.4 obtendremos «Warning: Creating default object from empty value in …».

Info extraída del manual de PHP:

En PHP 5 está disponible el nuevo nivel de error E_STRICT. Antes de PHP 5.4.0, E_STRICT no estaba incluido dentro de E_ALL, por lo que se teniía de habilitar explícitamente este tipo de nivel de error en PHP < 5.4.0. La habilitación de E_STRICT durante el desarrollo tiene algunos beneficios. Los mensajes STRICT proporcionan sugerencias que pueden ayudar a asegurarse de la mejor interoperabilidad y la compatibilidad hacia delante del código. Estos mensajes pueden incluir cosas como llamar a métodos no estáticos de forma estática, definir propiedades en una definición de clase compatible mientras se definió en un trait usado, y antes de PHP 5.3, algunas características obsoletas emitirían errores E_STRICT como asignar objetos por referencias durante la instanciación.

Es una forma de intentar que se respete el paradigma de orientación a objetos, así los mensajes E_STRICT ayudan a generar código PHP que ofrezca una mayor compatibilidad con versiones futuras.

Para evitar que se muestre ese error, debemos asegurarnos que trabajamos con objetos, generando uno vacío cuando no lo son:

<?php

if(!is_object($usuario))
{
    $usuario = new stdClass;
}

$usuario->nombre = 'Salvador';
$usuario->apellido = 'Mendez';

?>

Disponible PHP 5.5.10 y 5.4.26

El grupo de desarrolladores de PHP han anunciado la disponibilidad de las versiones 5.5.10 (listado de cambios) y 5.4.26 (listado de cambios). Como es habitual se recomienda a todos los usuarios actualizar a estas últimas versiones, están disponibles a través de la página de descarga.

También está disponible la versión de desarrollo 5.6.0alpha3, con los avances de la nueva versión.

Disponible PHP 5.5.9

El grupo de desarrolladores de PHP han anunciado la liberación de la versión 5.5.9, que corrige algunos bugs detectados en la versión 5.5.8 (lista de cambios), se recomienda a todos los usuarios que estén utilizando la versión 5.5 actualizar a la nueva versión.

También está disponible la versión 5.6.0alpha2, donde se incluyen nuevas características y se corrigen errores. A todos los que estén interesados en probar esta nueva versión se les recuerda que es una versión en desarrollo y no se debe usar en producción.