Novas Funcionalidades
PHP Core
Argumentos nomeados
O suporte para Argumentos nomeados foi adicionado.
Atributos
Suporte para Atributos foi adicionado.
Promoção de propriedade do construtor
Suporte para promoção de propriedade do construtor (declarando propriedades na assinatura do construtor) foi adicionado.
União de Tipos
O suporte para união de tipos foi adicionado.
Expressão Match
O suporte para expressões match
foi adicionado.
Operador Nullsafe
Suporte para o nullsafe operador (?->
) foi adicionado.
Outros novos recursos
-
A classe WeakMap foi adicionada.
-
A classe ValueError foi adicionada.
-
Qualquer número de parâmetros de função agora pode ser substituído por um argumento variádico, desde que os tipos sejam compatíveis. Por exemplo, o seguinte código agora é permitido:
<?php class A { public function method(int $many, string $parameters, $here) {} } class B extends A { public function method(...$everything) {} } ?>
-
static (como em "vinculação estática tardia") agora pode ser usado como um tipo de retorno:
<?php class Test { public function create(): static { return new static(); } } ?>
-
Agora é possível buscar o nome da classe de um objeto usando
$object::class
. O resultado é o mesmo queget_class($object)
. -
new
einstanceof
agora podem ser usados com expressões arbitrárias, usandonew (expression)(...$args)
e$obj instanceof (expression)
. -
Algumas correções de consistência na sintaxe da variável foram aplicadas, por exemplo, escrever
Foo::BAR::$baz
agora é permitido. -
Adicionada interface Stringable, que é implementada automaticamente se uma classe definir um método __toString().
-
As Traits agora podem definir métodos privados abstratos. Tais métodos devem ser implementados pela classe que usa o trait.
-
throw
agora pode ser usado como uma expressão. Isso permite usos como:<?php $fn = fn() => throw new Exception('Exception in arrow function'); $user = $session->user ?? throw new Exception('Must have user');
-
Uma vírgula final opcional agora é permitida nas listas de parâmetros.
<?php function functionWithLongSignature( Type1 $parameter1, Type2 $parameter2, // <-- Esta vírgula agora é permitida. ) { }
-
Agora é possível escrever
catch (Exception)
para capturar uma exceção sem armazená-la em uma variável. -
O suporte para tipo mixed foi adicionado.
-
Os métodos privados declarados em uma classe pai não impõem mais nenhuma regra de herança nos métodos de uma classe filha (com exceção dos construtores privados finais). O exemplo a seguir ilustra quais restrições foram removidas:
<?php class ParentClass { private function method1() {} private function method2() {} private static function method3() {} // Lança um aviso, pois "final" não tem mais efeito: private final function method4() {} } class ChildClass extends ParentClass { // Todos os itens a seguir agora são permitidos, mesmo que os modificadores não sejam // o mesmo que para os métodos privados na classe pai. public abstract function method1() {} public static function method2() {} public function method3() {} public function method4() {} } ?>
-
get_resource_id() foi adicionado, o que retorna o mesmo valor que
(int) $resource
. Ele fornece a mesma funcionalidade em uma API mais clara. -
O InternalIterator foi adicionado.
Data e hora
-
DateTime::createFromInterface() e DateTimeImmutable::createFromInterface() foram adicionados.
-
O especificador de formato DateTime
p
foi adicionado, que é o mesmo queP
, mas retornaZ
em vez de+00:00
para UTC.
DOM
DOMParentNode e DOMChildNode com novas APIs de travessia e manipulação foram adicionadas.
Filtro
FILTER_VALIDATE_BOOL
foi adicionado como um alias para
FILTER_VALIDATE_BOOLEAN
. O novo nome é preferido, pois usa o nome do
tipo canônico.
Enchant
enchant_dict_add(), enchant_dict_is_added() e
LIBENCHANT_VERSION
foram adicionados.chant
FPM
Adicionada uma nova opção pm.status_listen
que permite obter o status de um
terminal diferente (por exemplo, porta ou arquivo UDS), o que é útil para obter o status
quando todos os filhos estão ocupados atendendo a solicitações de execução longa.
Hash
Os objetos HashContext agora podem ser serializados.
Funções de Internacionalização
As contantes IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
e
IntlDateFormatter::RELATIVE_SHORT
foram adicionadas.
LDAP
ldap_count_references() foi adicionado, o que retorna o número de mensagens de referência em um resultado de pesquisa.
OPcache
Se a configuração ini opcache.record_warnings estiver habilitada, o OPcache gravará avisos em tempo de compilação e os reproduzirá na próxima inclusão, mesmo que seja servido do cache.
OpenSSL
Adicionado suporte de sintaxe de mensagem criptográfica (CMS) (» RFC 5652)
composto de funções para criptografia, descriptografia, assinatura, verificação e leitura. A API
é semelhante à API para funções PKCS #7 com a adição de novas constantes de codificação:
OPENSSL_ENCODING_DER
, OPENSSL_ENCODING_SMIME
e OPENSSL_ENCODING_PEM
:
- openssl_cms_encrypt() criptografa a mensagem no arquivo com os certificados e gera o resultado no arquivo fornecido.
- openssl_cms_decrypt() que descriptografa a mensagem S/MIME no arquivo e envia os resultados para o arquivo fornecido.
- openssl_cms_read() que exporta o arquivo CMS para uma matriz de certificados PEM.
- openssl_cms_sign() que assina a mensagem MIME no arquivo com um certificado e uma chave e gera o resultado no arquivo fornecido.
- openssl_cms_verify() que verifica se o bloco de dados está intacto, o signatário é quem diz ser e retorna os certificados dos signatários.
Expressões Regulares (Compatíveis com Perl)
preg_last_error_msg() foi adicionada, que retorna uma mensagem legível por humanos para o último erro PCRE. Ela complementa preg_last_error(), que retorna um valor de enumeração inteiro.
Reflection
-
Os seguintes métodos agora podem retornar informações sobre valores padrão de parâmetros de funções internas:
SQLite3
SQLite3::setAuthorizer() e respectivas constantes de classe foram adicionados para definir um callback userland que será usado para autorizar ou não uma ação no banco de dados.
Biblioteca padrão
-
str_contains(), str_starts_with() e str_ends_with() foram adicionados, que verificam se
haystack
contém, começa com ou termina comneedle
, respectivamente. -
fdiv() foi adicionado, que executa uma divisão de ponto flutuante sob a semântica IEEE 754. A divisão por zero é considerada bem definida e retornará um de
Inf
,-Inf
ouNaN
. -
get_debug_type() foi adicionado, o que retorna um tipo útil para mensagens de erro. Ao contrário de gettype(), ele usa nomes de tipo canônico, retorna nomes de classe para objetos e indica o tipo de recurso para recursos.
-
printf() e amigos agora suportam os especificadores de formato
%h
e%H
. Estes são os mesmos que%g
e%G
, mas sempre use"."
como o separador decimal, em vez de determiná-lo por meio da localidadeLC_NUMERIC
. -
printf() e amigos agora suportam o uso de
"*"
como largura ou precisão, caso em que a largura/precisão é passada como um argumento para printf. Isso também permite usar a precisão-1
com%g
,%G
,%h
e%H
. Por exemplo, o código a seguir pode ser usado para reproduzir a formatação de ponto flutuante padrão do PHP:<?php printf("%.*H", (int) ini_get("precision"), $float); printf("%.*H", (int) ini_get("serialize_precision"), $float); ?>
-
proc_open() agora suporta descritores pseudo-terminal (PTY). O seguinte anexa
stdin
,stdout
estderr
ao mesmo PTY:<?php $proc = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes); ?>
-
proc_open() agora suporta descritores de pares de sockets. O seguinte anexa um par de sockets distinto a
stdin
,stdout
estderr
:<?php $proc = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes); ?>
Ao contrário dos pipes, os sockets não sofrem com problemas de bloqueio de E/S no Windows. No entanto, nem todos os programas podem funcionar corretamente com soquetes stdio.
-
As funções de classificação agora são estáveis, o que significa que os elementos de comparação igual manterão sua ordem original.
-
array_diff(), array_intersect() e suas variações agora podem ser usadas com um único array como argumento. Isso significa que usos como os seguintes agora são possíveis:
<?php // OK, mesmo que $excludes esteja vazio: array_diff($array, ...$excludes); // OK, mesmo que $arrays contenha apenas um único array: array_intersect(...$arrays); ?>
-
O parâmetro
flag
de ob_implicit_flush() foi alterado para aceitar um bool em vez de um int.
Tokenizador
PhpToken adiciona uma interface baseada em objeto ao tokenizer. Ele fornece uma representação mais uniforme e ergonômica, além de ser mais eficiente em termos de memória e mais rápido.
Zip
-
A extensão Zip foi atualizada para a versão 1.19.1.
-
Novo ZipArchive::setMtimeName() e ZipArchive::setMtimeIndex() para definir a hora de modificação de uma entrada.
-
Novo ZipArchive::registerProgressCallback() para fornecer atualizações durante o fechamento do arquivo.
-
Novo ZipArchive::registerCancelCallback() para permitir o cancelamento durante o fechamento do arquivo.
-
Novo ZipArchive::replaceFile() para substituir um conteúdo de entrada.
-
Novo ZipArchive::isCompressionMethodSupported() para verificar os recursos opcionais de compactação.
-
Novo ZipArchive::isEncryptionMethodSupported() para verificar os recursos opcionais de criptografia.
-
A propriedade ZipArchive::lastId para obter o valor do índice da última entrada adicionada foi adicionada.
-
Os erros agora podem ser verificados após o fechamento de um arquivo usando as propriedades ZipArchive::status e ZipArchive::statusSys ou o método ZipArchive::getStatusString().
-
A opção
'remove_path'
de ZipArchive::addGlob() e ZipArchive::addPattern() agora é tratada como um prefixo de string arbitrário (para consistência com a opção'add_path'
), enquanto anteriormente era tratada como um nome de diretório. -
Os recursos opcionais de compactação/criptografia agora estão listados no phpinfo.