Características nuevas

Expresiones constantes

Ahora es posible proporcionar una expresión escalar que involucre literales numéricos y de string y/o constantes en contextos donde PHP anteriormente demandaba un valor estático, tal como una constante, una declaración de una propiedad o argumentos de funciones predeterminados.

<?php
const UNO 1;
const 
DOS UNO 2;

class 
{
    const 
TRES DOS 1;
    const 
UN_TERCIO UNO self::TRES;
    const 
SENTENCE 'El valor de TRES es '.self::TRES;

    public function 
f($a UNO self::TRES) {
        return 
$a;
    }
}

echo (new 
C)->f()."\n";
echo 
C::SENTENCE;
?>

El resultado del ejemplo sería:

4
El valor de TRES es 3

Ahora también es posible definir un array constante utilizando la palabra reservada const:

<?php
const ARR = ['a''b'];

echo 
ARR[0];
?>

El resultado del ejemplo sería:

a

Funciones variádicas mediante ...

Las funciones variádicas ahora se pueden implementar usando el operador ..., en lugar de depender de func_get_args().

<?php
function f($requerido$opcional null, ...$parámetros) {
    
// $parámetros es un array que contiene los argumentos restantes.
    
printf('$requerido: %d; $opcional: %d; número de parámetros: %d'."\n",
           
$requerido$opcionalcount($parámetros));
}

f(1);
f(12);
f(123);
f(1234);
f(12345);
?>

El resultado del ejemplo sería:

$requerido: 1; $opcional: 0; número de parámetros: 0
$requerido: 1; $opcional: 2; número de parámetros: 0
$requerido: 1; $opcional: 2; número de parámetros: 1
$requerido: 1; $opcional: 2; número de parámetros: 2
$requerido: 1; $opcional: 2; número de parámetros: 3

Desempaquetar argumentos mediante ...

Los array y los objetos Traversable se pueden desempaquetar a listas de argumentos al invocar a funciones empleando el operador .... A esto también se le conoce como el operador 'splat' en otros lenguajes como Ruby.

<?php
function sumar($a$b$c) {
    return 
$a $b $c;
}

$operadores = [23];
echo 
sumar(1, ...$operadores);
?>

El resultado del ejemplo sería:

6

Exponenciación mediante **

Se a añadido un operador asociativo derecho, **, para realizar la exponenciación, junto con un operador de asignación abreviado, **=.

<?php
printf
("2 ** 3 ==      %d\n"** 3);
printf("2 ** 3 ** 2 == %d\n"** ** 2);

$a 2;
$a **= 3;
printf("a ==           %d\n"$a);
?>

El resultado del ejemplo sería:

2 ** 3 ==      8
2 ** 3 ** 2 == 512
a ==           8

use function y use const

El operador use se ha ampliado para admitir funciones de importación y constantes además de clases. Esto se lleva a cabo mediante los contructores use function y use const, respectivamente.

<?php
namespace Espacio\De\Nombres {
    const 
FOO 42;
    function 
f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const 
Espacio\De\Nombres\FOO;
    use function 
Espacio\De\Nombres\f;

    echo 
FOO."\n";
    
f();
}
?>

El resultado del ejemplo sería:

42
Espacio\De\Nombres\f

phpdbg

PHP ahora incluye un depurador interactivo llamado phpdbg, implementado como un módulo de SAPI. Para más información, visite la » documentación de phpdbg.

Codificación de caracteres predeterminada

default_charset ahora se emplea como conjunto de caracteres predeterminado para las funciones htmlentities(), html_entity_decode() y htmlspecialchars(). Observe que si los ajustes de codificación iconv y mbstring (ahora obsoletos) están establecidos, tomarán precedencia sobre default_charset para las funciones de iconv y mbstring, respectivamente.

El valor predeterminado para este ajuste es UTF-8.

php://input es reutilizable

php://input ahora podría se reabierto y leído tantas veces como sea necesario. Este trabajo también ha resultado en una mayor reducción de la cantidad de memoria necesaria para tratar con datos POST.

Subidas de ficheros grandes

Ahora se admiten subidas de ficheros de más de 2 gigabytes.

GMP soporta la sobrecarga de operadores

Los objetos GMP ahora soportan la sobrecarga de operadores y la conversión a tipos escalares. Esto permite código más expresivo empleando GMP:

<?php
$a 
gmp_init(42);
$b gmp_init(17);

if (
version_compare(PHP_VERSION'5.6''<')) {
    echo 
gmp_intval(gmp_add($a$b)), PHP_EOL;
    echo 
gmp_intval(gmp_add($a17)), PHP_EOL;
    echo 
gmp_intval(gmp_add(42$b)), PHP_EOL;
} else {
    echo 
$a $bPHP_EOL;
    echo 
$a 17PHP_EOL;
    echo 
42 $bPHP_EOL;
}
?>

El resultado del ejemplo sería:

59
59
59

hash_equals() para comparar string con seguridad contra ataques de temporización

Se ha añadido la función hash_equals() para comparar dos string en tiempo constante. Esto debería emplearse para mitigar los ataques de temporización; por ejemplo, al probar los hash de contraseñas de crypt() (asumiendo que no se puede usar password_hash() y password_verify(), que no son susceptibles a ataques de temporización).

<?php
$previsto   
crypt('12345''$2a$07$usesomesillystringforsalt$');
$correcto   crypt('12345''$2a$07$usesomesillystringforsalt$');
$incorrecto crypt('1234',  '$2a$07$usesomesillystringforsalt$');

var_dump(hash_equals($previsto$correcto));
var_dump(hash_equals($previsto$incorrecto));
?>

El resultado del ejemplo sería:

bool(true)
bool(false)

__debugInfo()

El método mágico __debugInfo() se ha añadido para permitir a los objetos cambiar las propiedades y los valores que se muestran cuando el objeto se imprime al utilizar var_dump().

<?php
class {
    private 
$prop;

    public function 
__construct($val) {
        
$this->prop $val;
    }

    public function 
__debugInfo() {
        return [
            
'propSquared' => $this->prop ** 2,
        ];
    }
}

var_dump(new C(42));
?>

El resultado del ejemplo sería:

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

Algoritmo de hash gost-crypto

Se ha añadido el algoritmo de hash gost-crypto. Implementa la función de hash GOST usando las tablas S-box de CryptoPro, como se especifica en la » RFC 4357, sección 11.2.

Mejoras en SSL/TLS

Se han realizado un amplio rango de mejoras al soporte para SSL/TLS en PHP 5.6. Estas incluyen la habilitación de la verificación del par por omisión, el soporte para la comparación de huellas digitales de certificados, la mitigación de ataques de renegociación TLS, y muchas opciones de contexto SSL nuevas para permitir un mayor control de grano fino en ajustes de protocolos y verificaciones al emplear flujos encriptados.

Estos cambios están descritos con más detalle en la sección Cambios de OpenSSL en PHP 5.6.x de esta guía de migración.

Soporte para pgsql asíncrono

La extensión pgsql ahora admite conexiones y consultas asíncronas, habilitando así un comportamiento de no bloqueo al interactuar con bases de datos de PostgreSQL. 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.