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