Aunque la nueva versión de PHP es menor, ya trae muchas características nuevas, sin exagerar, interesantes tanto para la sintaxis del lenguaje como para su rendimiento. La lista de innovaciones no es definitiva, pero los principales cambios ya se han realizado y aceptado. El lanzamiento está programado para diciembre de 2019.

Cambios clave para la próxima versión:
- Propiedades de clase con tipo
- Precarga para un mejor rendimiento
- Funciones de flecha para escritura breve funciones anónimas
- Asignación de operador de unión con nulo (?? =)
- Covarianza / contravarianza en firmas de métodos heredados
- Una interfaz de función externa que abre nuevas posibilidades para desarrollar extensiones en PHP
- Operador de desempaquetado en matrices
Lea más sobre estos y otros cambios debajo del gato.
Descargo de responsabilidad: Varias veces, en mis conversaciones con colegas, apareció el artículo de Brent " Nuevo en PHP 7.4 ". Al principio quería hacer una traducción, pero en el proceso me di cuenta de que no todas las actualizaciones más recientes se indican en el texto y que hay algunas imprecisiones, por lo que este artículo apareció en lugar de la traducción.Funciones de flecha ( RFC )
Las funciones de flecha le permiten hacer un registro más corto de funciones anónimas:
array_map(function (User $user) { return $user->id; }, $users) array_map(fn(User $user) => $user->id, $users)
Algunas características de la implementación adoptada de las funciones de flecha:
- Pueden acceder al ámbito
parent
, por lo que no es necesario usar la palabra clave use. $this
también $this
disponible, como en las funciones anónimas regulares.- Las funciones de flecha pueden contener solo una línea, que también es un operador de retorno.
Puedes leer más sobre ellos en este
artículo sobre Habr.
Propiedades tipificadas ( RFC )
¡Hurra! Las propiedades de clase ahora pueden tener una pista de tipo. Este es un cambio muy esperado desde PHP 7 hacia una escritura más fuerte del lenguaje. Ahora tenemos todas las características básicas para una escritura fuerte. Todos los tipos están disponibles para escribir, excepto
void
y
callable.
class Bar { public string $name; public ?int $amount; public Foo $foo; }
Si desea que considere con más detalle las nuevas posibilidades de escribir las propiedades de los objetos, tenga en cuenta en los comentarios y escribiré un artículo separado sobre ellos.
Asignar operador de unión nula ( RFC )
En lugar de una entrada tan larga:
$data['date'] = $data['date'] ?? new DateTime();
Ahora será posible escribir así:
$data['date'] ??= new DateTime();
Operador de desembalaje de matriz ( RFC )
Ahora puede usar el operador de desempaquetado en matrices:
$arrayA = [1, 2, 3]; $arrayB = [4, 5]; $result = [0, ...$arrayA, ...$arrayB, 6 ,7]; <i>// [0, 1, 2, 3, 4, 5, 6, 7]</i>
Tenga en cuenta que esto solo funciona con matrices no asociativas.
Interfaz de función externa ( RFC )
La interfaz de función externa (FFI) le permite escribir código C directamente en código PHP. Esto significa que las extensiones PHP pueden escribirse en PHP puro.
Cabe señalar que este es un tema complejo. Todavía necesita conocimiento de C para usar estas funciones correctamente.
Precarga ( RFC )
La precarga es una excelente adición al núcleo de PHP, lo que debería conducir a algunas mejoras significativas de rendimiento.
Por ejemplo, si usa el marco, sus archivos se deben descargar y volver a compilar para cada solicitud. Cuando se usa opcache, la primera vez que estos archivos participan en el procesamiento de una solicitud y luego cada vez que se verifican con éxito los cambios. La precarga permite al servidor cargar los archivos PHP especificados en la memoria al inicio y tenerlos constantemente disponibles para todas las solicitudes posteriores, sin verificaciones adicionales de cambios en los archivos.
La mejora del rendimiento "no es gratuita": si se modifican los archivos precargados, se debe reiniciar el servidor.
Covarianza / contravarianza en firmas de métodos heredados ( RFC )
Actualmente, PHP tiene principalmente tipos de parámetros invariables y tipos de retorno invariantes. Este cambio le permite cambiar el tipo del parámetro a uno de sus supertipos. A su vez, el tipo devuelto puede ser reemplazado por su subtipo. Por lo tanto, este cambio permitirá seguir más estrictamente el principio de sustitución Barbara Liskov.
Un ejemplo de uso de un tipo de retorno covariante:
interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; }
y argumento contravariante:
interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { function concat(iterable $input) {/* . . . */} }
Serialización de objetos personalizados ( RFC )
Hay dos nuevos métodos mágicos disponibles:
__serialize
y
__unserialize
. Este mecanismo de serialización combina la versatilidad de la interfaz
Serializable
con el enfoque de implementación de
__sleep/__wakeup
métodos
__sleep/__wakeup
. Se pueden encontrar más detalles sobre sus diferencias en el RFC.
Prioridad de concatenación ( RFC )
Si escribiste algo como esto:
echo "sum: " . $a + $b;
PHP ahora interpretaría esto como:
echo ("sum: " . $a) + $b;
PHP 8 interpretará esto de manera diferente:
echo "sum :" . ($a + $b);
PHP 7.4 agrega una advertencia de obsolescencia cuando detecta una expresión que contiene "." antes del "+" o "-" y no entre corchetes.
__toString
( RFC ) soporte de excepción
Anteriormente, no se podían lanzar excepciones desde el método mágico
__toString
. La razón de este comportamiento es que la conversión de objetos a cadenas se realiza en muchas funciones de la biblioteca estándar, y no todas están listas para "procesar" excepciones correctamente. Como parte de este RFC, se realizó una auditoría exhaustiva de las conversiones de cadenas en la base del código, y esta restricción ahora se puede eliminar, lo que se hizo.
Reflexión de enlace ( RFC )
Las bibliotecas, como
symfony/var-dumper
, dependen en gran medida de
ReflectionAPI
para mostrar con precisión las variables. Anteriormente, no había un soporte adecuado para la reflexión de enlaces, lo que obligaba a estas bibliotecas a confiar en los hacks para detectar enlaces. PHP 7.4 agrega una clase
ReflectionReference
que resuelve este problema.
Se mb_str_split
método mb_str_split
( RFC )
Esta función proporciona la misma funcionalidad que
str_split
, pero para cadenas escritas en codificaciones multibyte.
Siempre disponible ext-hash
( RFC )
Esta extensión ahora está constantemente disponible en todas las instalaciones de PHP.
PEAR no está habilitado por defecto ( EXTERNOS )
PEAR ya no es compatible, el equipo central decidió eliminarlo de la instalación predeterminada con PHP 7.4.
Registro de algoritmo de hash de contraseña ( RFC )
Se ha agregado una nueva función
password_algos
, que devuelve una lista de todos los algoritmos de hashing de contraseñas registrados.
Enlaces débiles ( RFC )
Los enlaces débiles le permiten guardar un enlace a un objeto que no impide la destrucción de este objeto. Por ejemplo, son útiles para implementar estructuras de tipo caché.
Delimitador literal de número ( RFC )
La ausencia de separadores visuales en grupos de dígitos aumentó el tiempo de lectura y depuración del código, y podría provocar errores involuntarios. Ahora se agregó soporte para el carácter de subrayado en literales numéricos para separar visualmente grupos de números.
1_000_000_000 // int 6.674_083e-11; // float 299_792_458; // decimal 0xCAFE_F00D; // hexadecimal 0b0101_1111; // binary 0137_041; // octal
Etiquetas abiertas cortas en desuso ( RFC )
Etiqueta de apertura corta
<?
está en desuso y se eliminará en PHP 8. La etiqueta corta
<?= (echo)
no se vio afectada.
Operador ternario asociativo izquierdo rechazado obsoleto ( RFC )
El operador ternario tiene algunas peculiaridades extrañas en PHP. Este RFC desprecia los operadores ternarios anidados.
1 ? 2 : 3 ? 4 : 5; // deprecated (1 ? 2 : 3) ? 4 : 5; // ok
En PHP 8, dicho registro dará como resultado un error de nivel de compilación.
Cambios incompatibles hacia atrás ( ACTUALIZACIÓN )
Estos son algunos de los cambios incompatibles con versiones anteriores más importantes:
- Una llamada a
parent::
en una clase sin un padre está en desuso. - Llamar a
var_dump
en una instancia de DateTime
o DateTimeImmutable
ya no hace que las propiedades del objeto estén disponibles. openssl_random_pseudo_bytes
arrojará una excepción en situaciones de error causadas por la biblioteca OpenSSL. Anteriormente, devolvió falso, lo que podría conducir a la generación de una cadena vacía.- Intentar serializar un
PDO
o una instancia de un PDOStatement
una Exception
lugar de una PDOException
. - Llamar a
get_object_vars()
en una instancia de ArrayObject
devolverá las propiedades del ArrayObject
sí, no el valor de la matriz envuelta. Para obtener valores de matriz ajustados como antes, ArrayObject
en el tipo de array
.