O suporte para Argumentos nomeados foi adicionado.
Suporte para Atributos foi adicionado.
Suporte para promoção de propriedade do construtor (declarando propriedades na assinatura do construtor) foi adicionado.
O suporte para união de tipos foi adicionado.
O suporte para expressões match
foi adicionado.
Suporte para o nullsafe operador (?->
) foi adicionado.
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 que get_class($object)
.
new
e instanceof
agora podem ser usados com expressões arbitrárias,
usando new (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.
DateTime::createFromInterface() e DateTimeImmutable::createFromInterface() foram adicionados.
O especificador de formato DateTime p
foi adicionado, que é o mesmo que
P
, mas retorna Z
em vez de +00:00
para UTC.
DOMParentNode e DOMChildNode com novas APIs de travessia e manipulação foram adicionadas.
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_dict_add(), enchant_dict_is_added() e
LIBENCHANT_VERSION
foram adicionados.chant
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.
Os objetos HashContext agora podem ser serializados.
As contantes IntlDateFormatter::RELATIVE_FULL
,
IntlDateFormatter::RELATIVE_LONG
,
IntlDateFormatter::RELATIVE_MEDIUM
e
IntlDateFormatter::RELATIVE_SHORT
foram adicionadas.
ldap_count_references() foi adicionado, o que retorna o número de mensagens de referência em um resultado de pesquisa.
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.
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
:
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.
Os seguintes métodos agora podem retornar informações sobre valores padrão de parâmetros de funções internas:
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.
str_contains(), str_starts_with() e
str_ends_with() foram adicionados, que verificam se haystack
contém,
começa com ou termina com needle
, 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
ou NaN
.
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 localidade LC_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
e stderr
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
e
stderr
:
<?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.
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.
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.