Novos Recursos
Núcleo do PHP
Ganchos de Propriedades
Propriedades de objetos agora podem ter uma lógica adicional associada com suas
operações get
e set
.
Dependendo do uso, isso pode ou não tornar a propriedade virtual,
ou seja, não existe nenhum valor de apoio.
<?php
class Person
{
// Uma propriedade "virtual". Não pode ser definida explicitamente.
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}
// Todas as operações de escrita passam por este gancho e o resultado é o que for escrito.
// Acesso de leitura ocorre normalmente.
public string $firstName {
set => ucfirst(strtolower($value));
}
// Todas as operações de escrita passam por este gancho, que precisa escrever no próprio valor de apoio.
// Acesso de leitura ocorre normalmente.
public string $lastName {
set {
if (strlen($value) < 2) {
throw new \InvalidArgumentException('Muito curto');
}
$this->lastName = $value;
}
}
}
$p = new Person();
$p->firstName = 'pedro';
print $p->firstName; // Exibe "Pedro"
$p->lastName = 'Pedroso';
print $p->fullName; // Exibe "Pedro Pedroso"
Visibilidade de Propriedade Assimétrica
Propriedades de objetos agora podem ter suas visibilidades set
constroladas separadamente das visibilidades get
.
<?php
class Example
{
public protected(set) string $name;
public function __construct(string $name)
{
$this->name = $name;
}
}
Objetos Lentos
Agora é possível criar objetos cuja inicialização é adiada até serem acessados. Bibliotecas e estruturas podem aproveitar esses objetos lentos para adiar a busca de dados ou dependências necessárias para inicialização.
<?php
class Example
{
public function __construct(private int $data)
{
}
// ...
}
$initializer = static function (Example $ghost): void {
// Busca dados ou dependências
$data = ...;
// Inicializa
$ghost->__construct($data);
};
$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);
Atributo #[\Deprecated]
O novo atributo Deprecated pode ser usado para marcar funções, métodos
e constantes de classe como descontinuados. O comportamento da funcionalidade descontinuada com este
atributo corresponde ao comportamento do mecanismo de descontinuação existente para as funcionalides
fornecidas pelo próprio PHP. A única exceção é que o código de erro emitido é
E_USER_DEPRECATED
ao invés de E_DEPRECATED
.
Descontinuações existentes nas funcionalidades fornecidas pelo próprio PHP foram atualizadas para usar o atributo, melhorando as mensagens de erro emitidas através da inclusão de uma breve explicação.
Analisando solicitações RFC1867 (multipartes) em solicitações HTTP não-POST
Adicionada a função request_parse_body() que permite analisar solicitações RFC1867 (multipartes) em solicitações HTTP não-POST.
Encadeando expressões new
sem parênteses
Novas expressões com argumentos de construtor agora são desreferenciáveis, o que significa que permitem encadear chamadas de métodos, acessos a propriedades etc., sem colocar a expressão entre parênteses.
Informação de Depuração Melhorada para WeakReference
A obtenção de informação de depuração para a classe WeakReference agora
também conterá o objeto referenciado, ou null
se a referência não
for mais válida.
Improved Debugging Info for Closure
A saída do método Closure::__debugInfo() agora inclui o nome, o arquivo e a linha do Closure.
Definindo Símbolos Idênticos em Diferentes Blocos de Espaços de Nomes
Sair de um espaço de nomes agora limpa os símbolos visíveis. Isso permite usar um símbolo em um bloco de espaço de nomes, mesmo que um bloco de espaço de nomes anterior tenha declarado um símbolo com o mesmo nome.
cURL
curl_version() retorna um valor
feature_list
adicional, que é um array associativo
de todos os recursos cURL conhecidos, e se eles são suportados (true
)
ou não (false
).
Adicionadas as constantes CURL_HTTP_VERSION_3
e
CURL_HTTP_VERSION_3ONLY
(disponíveis
desde a libcurl 7.66 e 7.88) como opções possíveis para
CURLOPT_HTTP_VERSION
.
Adicionada a constante CURLOPT_PREREQFUNCTION
como uma opção do cURL que
aceita um callable para ser chamado depois que a conexão tenha sido feita,
mas antes que a requisição seja enviada.
Esta chamável precisa retornar CURL_PREREQFUNC_OK
ou
CURL_PREREQFUNC_ABORT
para permitir ou abortar a requisição.
Adicionada a constante CURLOPT_SERVER_RESPONSE_TIMEOUT
,
que era anteriormente conhecida como CURLOPT_FTP_RESPONSE_TIMEOUT
.
Ambas as constantes contêm o mesmo valor.
Adicionada a constante CURLOPT_DEBUGFUNCTION
como uma opção do cURL que
aceita um callable que é chamado durante o tempo de vida da requisição
com o objeto CurlHandle,
um inteiro contendo o tipo da mensagem de depuração, e uma string contendo a
mensagem de depuração.
O tipo da mensagem de depuração é uma das seguintes constantes:
CURLINFO_TEXT
CURLINFO_HEADER_IN
CURLINFO_HEADER_OUT
CURLINFO_DATA_IN
CURLINFO_DATA_OUT
CURLINFO_SSL_DATA_IN
CURLINFO_SSL_DATA_OUT
CURLINFO_HEADER_OUT
não pode ser definida porque ela usa a mesma funcionalidade da libcurl.
A função curl_getinfo() agora retorna uma chave adicional
posttransfer_time_us
, contendo o número de
microssegundos desde o início até o último byte ser enviado.
Quando um redirecionamento é seguido, o tempo de cada requisição é adicionado cumulativamente.
Este valor também pode ser recuperado passando
CURLINFO_POSTTRANSFER_TIME_T
para o parâmetro
option
da função curl_getinfo().
Requer libcurl 8.10.0 ou posterior.
DOM
Adicionado o espaço de nomes Dom com novas classes como contrapartes às classes DOM existentes (ex.: Dom\Node é a nova DOMNode). Estas classes são compatíveis com HTML 5 e cumprem as especificações WHATWG; resolvendo problemas antigos na extensão DOM. As classes DOM antigas continuam disponíveis para compatibilidade com versões anteriores.
Adicionado o método DOMNode::compareDocumentPosition() com suas constantes associadas:
DOMNode::DOCUMENT_POSITION_DISCONNECTED
DOMNode::DOCUMENT_POSITION_PRECEDING
DOMNode::DOCUMENT_POSITION_FOLLOWING
DOMNode::DOCUMENT_POSITION_CONTAINS
DOMNode::DOCUMENT_POSITION_CONTAINED_BY
DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Agora é possível passar qualquer chamável para
DOMXPath::registerPhpFunctions().
Além disso, com DOMXPath::registerPhpFunctionNs(),
agora podem ser registradas funções de retorno usarão sintaxe de chamada de função nativa
em vez de usar php:function('name')
.
FPM
Descarregar cabeçalhos sem um corpo agora será uma operação bem-sucedida.
Página de status agora tem um novo campo para mostrar um pico de consumo de memória.
Intl
Adicionada a constante NumberFormatter::ROUND_HALFODD
para
complementar a funcionalidade existente da constante
NumberFormatter::ROUND_HALFEVEN
.
OpenSSL
Adicionado suporte para chaves baseadas em Curve25519 + Curve448. Especificamente, os campos x25519, ed25519, x448 e ed448 são suportados em openssl_pkey_new(), openssl_pkey_get_details() e openssl_sign() e openssl_verify() foi estendida para suportar essas chaves.
Implementado o hash de senha PASSWORD_ARGON2. Requer OpenSSL 3.2 e compilação NTS do PHP.
PCRE
A biblioteca integrada pcre2lib foi atualizada para a versão 10.44. Como consequência, o suporte a LoongArch JIT foi adicionado, espaços agora são permitidos entre chaves em itens compatíveis com Perl, e afirmações de comprimento variável que olham para trás agora são suportadas.
Com a biblioteca pcre2lib versão 10.44, o comprimento máximo de grupos de captura nomeados
foi alterado de 32
para 128
.
Adicionado suporte para o modificador r
(PCRE2_EXTRA_CASELESS_RESTRICT),
e também para o modificador de modo (?r)
mode modifier.
Quando habilitados juntos com o modificador de insensibilidade a maiúsculas/minúsculas (i
),
a expressão bloqueia a mistura de caracteres ASCII e não ASCII.
PDO
Adicionado suporte para subclasses de drivers específicos. Esta RFC adiciona subclasses para PDO afim de suportar melhor as funcionalidades específicas de cada bancos de dados. As novas classes são instanciáveis tanto pela chamada ao método PDO::connect() quanto pela instanciação direta da subclasse específica do driver.
Adicionado suporte para analisadores SQL específicos de drivers. Os analisador padrão suporta:
- literais com aspas simples e duplas, com a duplicação como um mecanismo de escape
- comentários no estilo C não aninhados e comentários de dois hífens
PDO_MYSQL
Adicionado suporte a analisador personalizado:
- literais com aspas simples e duplas, com a duplicação e a barra invertida como mecanismos de escape
- identificadores de literais com crase (`), com a duplicação como mecanismo de escape
- comentários de dois hífens seguidos por pelo menos 1 espaço, comentários no estilo C não aninhados, e comentários hash
PDO_PGSQL
Adicionado suporte a analisador personalizado:
- literais com aspas simples e duplas, com a duplicação como mecanismo de escape
-
strings literais de "escape" no estilo C (
E'string'
) - strings literais envolvidos por cifrão
- comentários com dois hífens e no estilo C (não aninhados)
-
suporte para
??
como sequência de escape para o operador?
PDO_SQLITE
Adicionado suporte a analisador personalizado:
- literais com aspas simples (''), aspas duplas (""), e crases (``), com a duplicação como mecanismo de escape
- marcação com colchetes para identificadores
- comentários de dois hífens e comentários no estilo C (não aninhados)
Phar
Adicionado suporte para a extensão de timestamp Unix para arquivos Zip.
Readfile
Adicionada a capacidade de alteração do caminho de .php_history
através
da variável de ambiente PHP_HISTFILE.
Reflection
ReflectionAttribute agora contém uma propriedade name para melhorar a experiência de depuração.
ReflectionClassConstant::__toString() e ReflectionProperty::__toString() agora retornam os comentários do documento anexado.
Vários novos métodos e constantes relacionados com a funcionalidade de objetos lentos foram adicionados:
- ReflectionClass::newLazyGhost()
- ReflectionClass::newLazyProxy()
- ReflectionClass::resetAsLazyGhost()
- ReflectionClass::resetAsLazyProxy()
- ReflectionClass::isUninitializedLazyObject()
- ReflectionClass::initializeLazyObject()
- ReflectionClass::markLazyObjectAsInitialized()
- ReflectionClass::getLazyInitializer()
- ReflectionClass::skipLazyInitialization()
- ReflectionClass::setRawValueWithoutLazyInitialization()
-
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
-
ReflectionClass::SKIP_DESTRUCTOR
SOAP
Adicionado suporte para notação Clark para espaços de nomes no mapa de classes.
Agora é possível especificar entradas em um mapa de classes com notação Clark
para resolver um tipo com um espaço de nomes específico para uma classe específica.
Por exemplo: '{http://example.com}foo' => 'FooClass'
.
Instâncias de DateTimeInterface que são
passadas para xsd:datetime
ou elementos similares agora são
serializadas como tais ao invés de serem serializadas como uma string vazia.
A persistência de sessão agora funciona com um módulo de sessão compartilhado.
Standard
Adicionada uma nova enumeração RoundingMode com nome mais claros
e capacidade de descoberta melhorada quando comparada com as
constantes PHP_ROUND_*
.
Mais ainda, quatro novos modes de arredondamento foram adicionados, que estão disponíveis somente
através da nova enumeração RoundingMode.
XSL
Agora é possível usar parâmetros que contenham tanto aspas simples quanto aspas duplas.
Agora é possível passar qualquer chamável para o método XSLTProcessor::registerPhpFunctions().
Adicionada as propriedades XSLTProcessor::$maxTemplateDepth e XSLTProcessor::$maxTemplateVars para controlar a profundidade de recursão da avaliação de modelo XSL.
Zip
Adicionada a constante ZipArchive::ER_TRUNCATED_ZIP
,
que foi adicionada na libzip 1.11.