Lanzamento da linguaxe de programación PHP 8.1

Despois dun ano de desenvolvemento, presentouse o lanzamento da linguaxe de programación PHP 8.1. A nova rama inclúe unha serie de novidades, así como varios cambios que rompen a compatibilidade.

Melloras clave en PHP 8.1:

  • Engadido soporte para enumeracións, por exemplo, agora pode usar as seguintes construcións: enum Estado { case Pendente; caso Activo; caso Arquivado; } clase Publicar { función pública __construír( privado Estado $estado = Estado::Pendente; ) {} función pública setStatus(Estado $estado): void { // … } } $post->setStatus(Estado::Activo);
  • Engadido soporte para fíos lixeiros chamados Fibras, que permiten xestionar fíos de execución a un nivel baixo. Está previsto engadir soporte de fibra aos marcos Amphp e ReactPHP. $fibra = Fibra nova (función (): void { $valorAfterResuming = Fibra::suspend('despois da suspensión'); // ... }); $valorAfterSuspending = $fibra->inicio(); $fiber->resume('despois de retomar');
  • Mellorouse a implementación da caché de código obxecto (opcache), facendo posible almacenar na caché información sobre a herdanza de clases. A optimización permitiu aumentar o rendemento dalgunhas aplicacións nun 5-8%. Outras optimizacións inclúen a optimización do funcionamento JIT, a implementación do soporte JIT para a arquitectura ARM64 (AArch64), a aceleración da resolución de nomes, a optimización das bibliotecas timelib e ext/date, o aumento do rendemento de serialización e deserialización, a optimización de get_declared_classes(), explode() , función strtr(), strnatcmp(), dechex(). En xeral, hai un aumento do 23.0% no rendemento para Symfony Demo e un 3.5% para WordPress.
  • O operador de desempaquetado dentro das matrices "...$var", que permite a substitución de matrices existentes ao definir unha nova matriz, ampliouse para admitir claves de cadea (anteriormente só se admitían os identificadores dixitais). Por exemplo, agora pode usar no código: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $matriz = [“a” => 0, …$matriz1, …$matriz2]; var_dump($array); // ["a" => 1, "b" => 2]
  • Permítese usar a palabra clave "new" nos inicializadores, como nas definicións de funcións como parámetro predeterminado ou nos atributos dos argumentos. clase MyController { función pública __construct( registrador privado $logger = new NullLogger(), ) {} }
  • É posible marcar as propiedades de clase para o acceso de só lectura (a información destas propiedades só se pode escribir unha vez, despois da cal non estará dispoñible para cambiar). class PostData { función pública __construír( cadea de só lectura pública $título, só lectura pública DateTimeInmutable $data, ) {} } $publicación = new Post('Título', /* … */); $post->title = 'Outro'; > Erro: non se pode modificar a propiedade de só lectura Post::$title
  • Implementouse unha nova sintaxe para obxectos invocables: agora pódese formar un peche chamando a unha función e pasándolle o valor "..." como argumento (é dicir, myFunc(...) en lugar de Closure::fromCallable('myFunc ')): función foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Engadiuse compatibilidade total para os tipos de intersección, o que lle permite crear novos tipos combinando os existentes. A diferenza dos tipos de unión, que definen coleccións de dous ou máis tipos, os tipos de intersección requiren a presenza non de ningún dos tipos listados, senón de todos os tipos especificados no conxunto para cubrir. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Hai un novo tipo "nunca" que se pode usar para informar aos analizadores estáticos de que unha función rematará a execución do programa, por exemplo, lanzando unha excepción ou executando a función de saída. función dd($entrada mixta): nunca { saír; }
  • Propúxose unha nova función array_is_list, que permite determinar que as claves da matriz están dispostas en orde de valores numéricos crecentes, a partir de 0: $lista = [“a”, “b”, “c”]; matriz_é_lista($lista); // verdadeiro $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($taménNotAList); // falso
  • Agora podes usar a palabra clave "final" para evitar que se anulen as constantes da clase pai. class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; > Erro fatal: Bar::X non pode anular a constante final Foo::X }
  • Propóñense as funcións fsync e fdatasync para forzar que se garden os cambios da caché do disco. $ficheiro = fopen("mostra.txt", "w"); fwrite($ficheiro, "Algún contido"); if (fsync($ficheiro)) { echo "O ficheiro conservouse correctamente no disco."; } fclose($ficheiro);
  • Engadida a posibilidade de usar os prefixos "0o" e "0O" para os números octais, ademais do prefixo "0" usado anteriormente. 016 === 0o16; // verdadeiro 016 === 0O16; // verdadeiro
  • Proponse limitar selectivamente o uso de $GLOBALS, o que levará a unha violación da compatibilidade con versións anteriores, pero permitirá acelerar significativamente as operacións con matrices. Por exemplo, estase considerando a posibilidade de desactivar a escritura en $GLOBALS e pasar $GLOBALS mediante un punteiro. Unha análise de 2000 paquetes mostrou que só 23 deles se verían afectados por este cambio. Por exemplo, se a proposta é aprobada, 8.1 deixará de admitir expresións como: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBAIS; unset($GLOBALS); by_ref($GLOBALS);
  • Os métodos internos agora deberían devolver o tipo correcto. En PHP 8.1, devolver un tipo que non coincide coa declaración da función producirá un aviso, pero en PHP 9.0 o aviso substituirase por un erro.
  • Continuouse o traballo de transferencia de funcións desde o uso de recursos ata a manipulación de obxectos. As funcións finfo_* e imap_* foron transferidas a obxectos.
  • Pasar valores nulos como argumentos a funcións internas marcadas como non anulables quedou en desuso. En PHP 8.1, usar construcións como str_contains("cadea", nulo) levará a un aviso, e en PHP 9 a un erro.
  • Engadido soporte para os algoritmos de hash MurmurHash3 e xxHash.

Fonte: opennet.ru

Engadir un comentario