Foi lançado o primeiro alpha da nova versão da linguagem de programação PHP 8.1. O lançamento está previsto para 25 de novembro. As principais novidades, já disponíveis para teste ou planejadas para implementação no PHP 8.1:
- Adicionada a suporte a enums, por exemplo, agora é possível usar as seguintes construções: enum Status { case Pending; case Active; case Archived; } class Post { public function __construct( private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
- Adicionada a suporte a fibers, que permitem gerenciar paralelismo em um nível mais baixo. A integração de fibers está prevista para os frameworks Amphp e ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('after suspending'); // … }); $valueAfterSuspending = $fiber->start(); $fiber->resume('after resuming');
- A implementação do cache de código objeto (opcache) foi aprimorada, introduzindo a possibilidade de armazenar em cache informações sobre herança de classes. A otimização aumentou o desempenho de alguns aplicativos em 5-8%.
- O operador de descompactação dentro de arrays «…$var», que permite a substituição de arrays existentes na definição de um novo array, foi ampliado com suporte a chaves de string (anteriormente apenas identificadores numéricos eram suportados). Por exemplo, agora pode-se usar no código: $array1 = ['a' => 1]; $array2 = ['b' => 2]; $array = ['a' => 0, …$array1, …$array2]; var_dump($array); // ['a' => 1, 'b' => 2]
- Foi introduzido um novo tipo «never», que pode ser usado para informar aos analisadores estáticos que uma função finaliza a execução do programa, por exemplo, chamando uma exceção ou executando a função exit. function dd(mixed $input): never { exit; }
- Foi sugerida uma nova função array_is_list, que permite determinar se as chaves de um array estão em ordem crescente de valores numéricos, começando de 0: $list = ['a', 'b', 'c']; array_is_list($list); // true $notAList = [1 => 'a', 2 => 'b', 3 => 'c']; array_is_list($notAList); // false $alsoNotAList = ['a' => 'a', 'b' => 'b', 'c' => 'c']; array_is_list($alsoNotAList); // false
- Foi proposta a possibilidade de redefinir constantes em uma classe durante a herança. Para proibir a redefinição de constantes da classe pai, pode-se usar a palavra-chave "final". class Foo { public const X = "foo"; final public const Z = "foo"; } class Bar extends Foo { public const X = "bar"; }
- As funções fsync e fdatasync foram propostas para forçar a gravação de mudanças do cache de disco. $file = fopen("sample.txt", "w"); fwrite($file, "Some content"); if (fsync($file)) { echo "O arquivo foi persistido com sucesso no disco."; } fclose($file);
- Adicionada a possibilidade de usar os prefixos "0o" e "0O" para números octais, além do prefixo "0" anteriormente usado. 016 === 0o16; // true 016 === 0O16; // true
- Foi proposta uma limitação seletiva ao uso de $GLOBALS, o que resultará em quebra de compatibilidade retroativa, mas permitirá acelerar significativamente as operações com arrays. Por exemplo, está sendo considerada a possibilidade de proibir a gravação em $GLOBALS e a passagem de $GLOBALS por referência. A análise de 2000 pacotes mostrou que apenas 23 seriam afetados por essa mudança. Por exemplo, se a proposta for aprovada, no PHP 8.1, o suporte a expressões como: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); by_ref($GLOBALS); será encerrado.
- O trabalho de conversão de funções de uso de recursos para manipulação de objetos continuou. As funções finfo_* e imap_* foram convertidas para objetos.
- Foi declarado obsoleto passar valores null como argumentos para funções internas marcadas como non-nullable. No PHP 8.1, o uso de construções como str_contains("string", null) gerará um aviso, e no PHP 9, um erro.
- Adicionada a suporte para os algoritmos de hash MurmurHash3 e xxHash.
Fonte: opennet.ru
