Lançamento da linguagem de programação PHP 8.1

Após um ano de desenvolvimento, foi apresentado o lançamento da linguagem de programação PHP 8.1. A nova ramificação inclui uma série de novos recursos, além de diversas mudanças que quebram a compatibilidade.

Principais melhorias no PHP 8.1:

  • Adicionado suporte para enumerações, por exemplo, agora você pode usar as seguintes construções: enum Status { case Pending; caso Ativo; caso arquivado; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Adicionado suporte para threads leves chamados Fibers, que permitem gerenciar threads de execução em um nível baixo. O suporte de fibra está planejado para ser adicionado às estruturas Amphp e ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('depois de suspender'); // ... }); $valueAfterSuspending = $fibra->start(); $fiber->resume('depois de retomar');
  • A implementação do cache de código objeto (opcache) foi aprimorada, tornando possível armazenar em cache informações sobre herança de classe. A otimização permitiu aumentar o desempenho de alguns aplicativos em 5 a 8%. Outras otimizações incluem otimização da operação JIT, implementação de suporte JIT para a arquitetura ARM64 (AArch64), aceleração da resolução de nomes, otimização de bibliotecas timelib e ext/date, aumento do desempenho de serialização e desserialização, otimização de get_declared_classes(), explode() , função strtr(), strnatcmp(), dechex(). Em geral, há um aumento de 23.0% no desempenho para Symfony Demo e 3.5% para WordPress.
  • O operador de descompactação dentro de arrays "...$var", que permite a substituição de arrays existentes ao definir um novo array, foi estendido para suportar chaves de string (anteriormente apenas identificadores digitais eram suportados). Por exemplo, agora você pode usar no código: $array1 = [“a” => 1]; $matriz2 = ["b" => 2]; $matriz = [“a” => 0,…$matriz1,…$matriz2]; var_dump($matriz); // ["a" => 1, "b" => 2]
  • É permitido usar a palavra-chave "new" em inicializadores, como em definições de funções como parâmetro padrão ou em atributos de argumentos. class MyController { função pública __construct( Logger privado $logger = new NullLogger(), ) {} }
  • É possível marcar propriedades de classe para acesso somente leitura (as informações nessas propriedades só podem ser gravadas uma vez, após o que não estarão disponíveis para alteração). class PostData { public function __construct( public readonly string $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /*… */); $post->title = 'Outro'; > Erro: Não é possível modificar a propriedade somente leitura Post::$title
  • Uma nova sintaxe foi implementada para objetos que podem ser chamados - um encerramento agora pode ser formado chamando uma função e passando-lhe o valor "..." como um argumento (ou seja, myFunc(...) em vez de Closure::fromCallable('myFunc ')): função foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Adicionado suporte completo para tipos de interseção, permitindo criar novos tipos combinando os existentes. Ao contrário dos tipos de união, que definem coleções de dois ou mais tipos, os tipos de interseção exigem a presença não de nenhum dos tipos listados, mas de todos os tipos especificados no conjunto a ser preenchido. function generateSlug(HasTitle&HasId $post) { return strtolower($post->getTitle()) . $post->getId(); }
  • Existe um novo tipo "nunca" que pode ser usado para informar aos analisadores estáticos que uma função encerrará a execução do programa, por exemplo, lançando uma exceção ou executando a função de saída. função dd (entrada $ mista): nunca {exit; }
  • Foi proposta uma nova função array_is_list, que permite determinar se as chaves do array estão organizadas em ordem crescente de valores numéricos, começando em 0: $list = [“a”, “b”, “c”]; array_is_list($lista); // verdadeiro $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; array_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; array_is_list($tambémNotAList); // falso
  • Agora você pode usar a palavra-chave "final" para evitar que as constantes da classe pai sejam substituídas. classe Foo {final public const X = "foo"; } class Bar estende Foo { public const X = "bar"; > Erro fatal: Bar::X não pode substituir a constante final Foo::X }
  • As funções fsync e fdatasync são propostas para forçar o salvamento das alterações no cache do disco. $arquivo = fopen("amostra.txt", "w"); fwrite($arquivo, "Algum conteúdo"); if (fsync($file)) { echo "O arquivo foi persistido com sucesso no disco."; } fclose($arquivo);
  • Adicionada a capacidade de usar os prefixos "0o" e "0O" para números octais, além do prefixo "0" usado anteriormente. 016 === 0o16; // verdadeiro 016 === 0O16; // verdadeiro
  • Propõe-se limitar seletivamente o uso de $GLOBALS, o que levará a uma violação da compatibilidade com versões anteriores, mas permitirá acelerar significativamente as operações com arrays. Por exemplo, está sendo considerada a possibilidade de desabilitar a escrita em $GLOBALS e a passagem de $GLOBALS por ponteiro. Uma análise de 2000 pacotes mostrou que apenas 23 deles seriam afetados por esta mudança. Por exemplo, se a proposta for aprovada, 8.1 não suportará mais expressões como: $GLOBALS = []; $GLOBAIS += []; $GLOBAIS =& $x; $x =& $GLOBAIS; não definido($GLOBALS); by_ref($GLOBALS);
  • Os métodos internos agora devem retornar o tipo correto. No PHP 8.1, retornar um tipo que não corresponda à declaração da função produzirá um aviso, mas no PHP 9.0 o aviso será substituído por um erro.
  • O trabalho continuou na transferência de funções do uso de recursos para a manipulação de objetos. As funções finfo_* e imap_* foram transferidas para objetos.
  • A passagem de valores nulos como argumentos para funções internas marcadas como não anuláveis ​​foi descontinuada. No PHP 8.1, usar construções como str_contains("string", null) levará a um aviso, e no PHP 9 a um erro.
  • Adicionado suporte para algoritmos de hash MurmurHash3 e xxHash.

Fonte: opennet.ru

Adicionar um comentário