Nuevas funcionalidades y cambios en PHP 5.6

  • #php

Funciones variádicas, desempaquetar argumentos o el nuevo operador exponencial, son solo algunas de las mejoras introducidas en PHP 5.6.

Ya hay fecha oficial para el lanzamiento de la versión estable 5.6 de PHP: 28 de agosto de 2014. El próximo jueves estará disponible esta nueva versión que si bien no aporta muchos cambios, los que vienen son interesantes y muy necesarios desde hacía tiempo. La retrocompatibilidad con versiones anteriores es casi plena puesto que apenas se han producido cambios de este tipo (ver al final).

Nuevas características

Expresiones en constantes

Previamente a PHP 5.6, era imposible asignar a una constante un valor que no fuera estático. A partir de ahora, se podrán usar expresiones:

PHP
const A = 5;
const B = 5 * 2;
const C = A * 2;

echo A;
echo B; // Sólo PHP 5.6
echo C; // Sólo PHP 5.6

Funciones variádicas

Para obtener un número indeterminado de argumentos en una función, anteriormente teníamos que hacer uso de func_get_args:

PHP
function getArgs() {
  $args = func_get_args();

  var_dump($args);
}

getArgs('req', 'opt1', 'opt2');

Y si queríamos identificar parámetros requeridos y opcionales, o bien nos encargábamos de ello manualmente dentro de la función, o teníamos que especificar una lista de argumentos en la declaración de la función:

PHP
function getArgs($req, $opt1, $opt2) {
  var_dump($req, $opt1, $opt2);
}

getArgs('req', 'opt1', 'opt2');

El problema de esto es que o ensuciamos el código, o tenemos que especificar una lista argumentos, algo imposible si no sabemos cuántos argumentos hay (lo cual solo deja la primera opción).

Con 5.6 esto se resuelve mediante las funciones variádicas y el operador .... Veamos un ejemplo:

PHP
function getArgs($req, ...$opts) {
  var_dump($req, $opts);
}

getArgs('req', 'opt1', 'opt2');

Como véis es muy sencillo, podemos especificar cuáles son requeridos y cuáles opcionales. Y por supuesto utilizar function getArgs(...$args) si así lo queremos.

Desempaquetar argumentos

El operador ... también sirve para desempaquetar argumentos en arrays y objetos Traversable. Vamos a verlo con un ejemplo:

PHP
function sum($a, $b, $c) {
  return $a + $b + $c;
}

var_dump(sum(2, 4, 6));

Esto por supuesto funciona en PHP 5.5 y anteriores. Pero, ¿que pasaría si quisiéramos utilizar un array para pasar los valores? Que tendríamos que recurrir a call_user_func_array:

PHP
function sum($a, $b, $c) {
  return $a + $b + $c;
}

$numbers = [2, 4, 6];
var_dump(call_user_func_array('sum', $numbers));

No muy elegante a decir verdad, pero al igual que con las funciones variádicas, también podemos utilizar el operador ... para indicar una lista indeterminada de argumentos:

PHP
function sum($a, $b, $c) {
  return $a + $b + $c;
}

$numbers = [2, 4, 6];
var_dump(sum(...$numbers));

Esto, en conjunción con function sum(...$numbers), nos otorga un dinamismo puro y duro.

Nuevo operador de exponenciación

Mediante el nuevo operador ** y su asignación corta **= podemos realizar exponenciación, algo que antes dependía de la función pow:

PHP
$x = 2 ** 3;

$y = 2;
$y **= 3;

echo $x; // 8
echo $y; // 8

La exponenciación se realiza de derecha a izquierda.

Ampliación del operador use

El operador use ahora permitirá importar funciones y constantes mediante use const y use function (antes solo se podían importar clases). Por ejemplo, en el siguiente namespace:

PHP
namespace Foo {
  const A = 1;
  function b() { echo 'Foo'; }
}

Lo que antes debía ejecutarse así:

PHP
namespace {
  use Foo as F;

  echo F\A;
  echo F();
}

Ahora podrá ejecutarse de la siguiente manera:

PHP
namespace {
  use const Foo\A;
  use function Foo;

  echo A;
  echo b();
}

Reutilización de php://input

Leer php://input en versiones anteriores solo se podía realizar una sola vez. A partir de ahora esto cambia y podrá leerse el flujo de datos tantas veces como se quiera. Además, esta mejora decrementa el uso de memoria requerida para leer datos POST, lo cual aumenta la eficiencia.

phpdbg

Desde PHP 5.4, phpdbg es una plataforma de depuración ligera y robusta, que ahora vendrá de serie en PHP 5.6 implementado como un módulo SAPI. Para más información, phpdbg.com.

Otras mejoras

Otras mejoras han sido introducidas en PHP 5.6:

  • En funciones que emplean codificación específica, ahora se utiliza default_charset por defecto, quedándose obsoleta la codificación de carácters mediante iconv y mbstring.
  • Ahora se permiten subidas de ficheros mayores a 2 gigabytes.
  • Los objetos GMP ahora soportan la sobrecarga de operadores y la conversión a tipos escalares. Lo que antes era gmp_add(gmp_init(10), gmp_init(20)) ahora puede hacerse mediante gmp_init(10) + gmp_init(20).
  • La nueva función hash_equals permite comparar strings con seguridad contra ataques de temporización.
  • Se ha añadido el algoritmo de hash gost-crypto.
  • Mejoras en SSL/TSL. Más información en cambios de OpenSSL en PHP 5.6
  • La extensión pgsql ahora admite conexiones y consultas asíncronas, evitando el bloqueo al interactuar con bases de datos de PostgreSQL. Habilitando la constante PGSQL_CONNECT_ASYNC, se podrán utilizar las funciones asíncronas pg_connect_poll, pg_socket, pg_consume_input y pg_flush.

Otros cambios

Compartir en