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