Lanzamiento del lenguaje de programación PHP 8.1

Luego de un año de desarrollo, se presentó el lanzamiento del lenguaje de programación PHP 8.1. La nueva rama incluye una serie de novedades, así como varios cambios que rompen la compatibilidad.

Mejoras clave en PHP 8.1:

  • Se agregó soporte para enumeraciones; por ejemplo, ahora puede usar las siguientes construcciones: enum Status { case Pending; caso Activo; caso Archivado; } clase Publicación { función pública __construct( Estado privado $estado = Estado::Pendiente; ) {} función pública setStatus(Estado $estado): void { // … } } $post->setStatus(Estado::Activo);
  • Se agregó soporte para subprocesos livianos llamados Fibers, que le permiten administrar subprocesos de ejecución en un nivel bajo. Está previsto agregar soporte de fibra a los marcos Amphp y ReactPHP. $fibra = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('después de suspender'); // ... }); $valueAfterSuspending = $fibra->start(); $fibra->resume('después de reanudar');
  • Se ha mejorado la implementación del caché de código objeto (opcache), lo que permite almacenar en caché información sobre la herencia de clases. La optimización hizo posible aumentar el rendimiento de algunas aplicaciones entre un 5% y un 8%. Otras optimizaciones incluyen optimización de la operación JIT, implementación de soporte JIT para la arquitectura ARM64 (AArch64), aceleración de la resolución de nombres, optimización de las bibliotecas timelib y ext/date, mayor rendimiento de serialización y deserialización, optimización de get_declared_classes(), explode() , función strtr(), strnatcmp(), dechex(). En general, hay un aumento del 23.0% en el rendimiento para Symfony Demo y del 3.5% para WordPress.
  • El operador de descompresión dentro de matrices "...$var", que permite la sustitución de matrices existentes al definir una nueva matriz, se ha ampliado para admitir claves de cadena (anteriormente solo se admitían identificadores digitales). Por ejemplo, ahora puedes usar en el código: $array1 = [“a” => 1]; $matriz2 = ["b" => 2]; $matriz = [“a” => 0, …$matriz1, …$matriz2]; var_dump($matriz); // ["a" => 1, "b" => 2]
  • Está permitido utilizar la palabra clave "nueva" en inicializadores, como en definiciones de funciones como parámetro predeterminado o en atributos de argumentos. clase MyController { función pública __construct( registrador privado $logger = nuevo NullLogger(), ) {} }
  • Es posible marcar propiedades de clase para acceso de solo lectura (la información en dichas propiedades solo se puede escribir una vez, después de lo cual no estará disponible para cambios). clase PostData { función pública __construct( cadena pública de solo lectura $título, pública de solo lectura DateTimeImmutable $fecha, ) {} } $post = new Post('Título', /* … */); $post->title = 'Otro'; > Error: No se puede modificar la propiedad de solo lectura Publicación::$título
  • Se ha implementado una nueva sintaxis para los objetos invocables: ahora se puede formar un cierre llamando a una función y pasándole el valor "..." como argumento (es decir, myFunc(...) en lugar de Clausura::fromCallable('myFunc ')): función foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a:1,b:2);
  • Se agregó soporte completo para tipos de intersecciones, lo que le permite crear nuevos tipos combinando los existentes. A diferencia de los tipos de unión, que definen colecciones de dos o más tipos, los tipos de intersección no requieren la presencia de ninguno de los tipos enumerados, sino de todos los tipos especificados en el conjunto que se va a completar. función generarSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Hay un nuevo tipo "nunca" que se puede utilizar para informar a los analizadores estáticos que una función finalizará la ejecución del programa, por ejemplo lanzando una excepción o ejecutando la función de salida. función dd(entrada $ mixta): nunca { salir; }
  • Se ha propuesto una nueva función array_is_list, que le permite determinar que las claves en la matriz están ordenadas en orden de valores numéricos crecientes, comenzando desde 0: $list = [“a”, “b”, “c”]; array_is_list($lista); // verdadero $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notALista); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($alsoNotAList); // FALSO
  • Ahora puede utilizar la palabra clave "final" para evitar que se anulen las constantes de la clase principal. clase Foo { final public const X = "foo"; } clase Bar extiende Foo { public const X = "barra"; > Error fatal: Bar::X no puede anular la constante final Foo::X }
  • Las funciones fsync y fdatasync se proponen para forzar que los cambios se guarden desde la caché del disco. $archivo = fopen("muestra.txt", "w"); fwrite($archivo, "Algunos contenidos"); if (fsync($file)) { echo "El archivo se ha persistido exitosamente en el disco."; } fclose($archivo);
  • Se agregó la capacidad de usar los prefijos "0o" y "0O" para números octales, además del prefijo "0" usado anteriormente. 016 === 0o16; // verdadero 016 === 0O16; // verdadero
  • Se propone limitar selectivamente el uso de $GLOBALS, lo que provocará una violación de la compatibilidad con versiones anteriores, pero permitirá acelerar significativamente las operaciones con matrices. Por ejemplo, se está considerando la posibilidad de deshabilitar la escritura en $GLOBALS y pasar $GLOBALS por puntero. Un análisis de 2000 paquetes mostró que sólo 23 de ellos se verían afectados por este cambio. Por ejemplo, si se aprueba la propuesta, 8.1 ya no admitirá expresiones como: $GLOBALS = []; $GLOBALES += []; $GLOBALES =& $x; $x =& $GLOBALES; desarmado($GLOBALS); by_ref($GLOBALS);
  • Los métodos internos ahora deberían devolver el tipo correcto. En PHP 8.1, devolver un tipo que no coincide con la declaración de función producirá una advertencia, pero en PHP 9.0 la advertencia será reemplazada por un error.
  • Se continuó trabajando en la transferencia de funciones del uso de recursos a la manipulación de objetos. Las funciones finfo_* e imap_* se han transferido a objetos.
  • Pasar valores nulos como argumentos a funciones internas marcadas como no anulables ha quedado obsoleto. En PHP 8.1, el uso de construcciones como str_contains("string", null) generará una advertencia y en PHP 9, un error.
  • Se agregó soporte para los algoritmos hash MurmurHash3 y xxHash.

Fuente: opennet.ru

Añadir un comentario