Alterações incompatíveis com versões anteriores

PHP Core

Acesso em estilo de array em não-array

Tentar usar valores do tipo null, bool, int, float ou resource como um array (como $null["key"]) agora irá gerar um aviso.

Função get_declared_classes()

A função get_declared_classes() não retorna mais classes anônimas que ainda não foram instanciadas.

Palavra-chave fn

fn agora é uma palavra-chave reservada. Em particular, ele não pode mais ser usado como um nome de função ou classe. Ela ainda pode ser usado como um nome constante de método ou classe.

A tag <?php no final do arquivo

<?php no final do arquivo (sem seguir a nova linha) agora será interpretado como uma tag PHP de abertura. Antes, era interpretada como uma short open tag seguida por um literal php e resultava em um erro de sintaxe (com short_open_tag=1) ou era interpretada como uma string literal <?php (com short_open_tag=0).

Stream wrappers

Ao usar include/require em uma stream, streamWrapper::stream_set_option() será chamado com a opção STREAM_OPTION_READ_BUFFER. As implementações personalizadas do wrapper de fluxo podem precisar implementar o método streamWrapper::stream_set_option() para evitar um aviso (sempre retornando false é uma implementação suficiente).

Serialização

O formato o de serialização foi removido. Como nunca é produzido pelo PHP, isso pode apenas interromper a desserialização de strings criadas manualmente.

Constantes do algoritmo de senha

Os identificadores do algoritmo de hash de senha agora são sequências anuláveis ​​em vez de números inteiros.

  • PASSWORD_DEFAULT era um int 1; agora é uma string '2y' (no PHP 7.4.0, 7.4.1 e 7.4.2 era null)
  • PASSWORD_BCRYPT era um int 1; agora é uma string '2y'
  • PASSWORD_ARGON2I era um int 2; agora é uma string 'argon2i'
  • PASSWORD_ARGON2ID era um int 3; agora é uma string 'argon2id'

Aplicações que usam corretamente as constantes PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I e PASSWORD_ARGON2ID continuarão funcionando corretamente.

Função htmlentities()

htmlentities() agora emitirá um aviso (em vez de um aviso estrito sobre os padrões) se for usado com uma codificação para a qual apenas a substituição básica de entidade é suportada; nesse caso, é equivalente ahtmlspecialchars().

Funções fread() e fwrite()

fread() e fwrite() agora retornarão false se a operação falhar. Antes uma string vazia ou 0 era retornado. EAGAIN/EWOULDBLOCK não são considerados falhas.

Essas funções agora também emitem um aviso de falha, como ao tentar gravar em um recurso de arquivo somente leitura.

Funções matemáticas de precisão arbitrária BCMath

As funções BCMath agora avisam se um número não bem formado é passado, como "32foo". O argumento será interpretado como zero, como antes.

CURL

Tentar serializar uma classe CURLFile agora irá gerar uma exceção. Antes, a exceção era lançada apenas na desserialização.

O uso de CURLPIPE_HTTP1 está descontinuado, e não é mais suportado a partir do cURL 7.62.0.

O parâmetro $version de curl_version() está descontinuado. Se qualquer valor diferente do padrão CURLVERSION_NOW for passado, um aviso será gerado e o parâmetro será ignorado.

Data e hora

Chamar a função var_dump() ou similar em uma instância de DateTime ou DateTimeImmutable não deixará mais propriedades acessíveis no objeto.

A comparação de objetos DateInterval (usando ==, <, e assim por diante) agora gera um aviso e sempre retorna false. Antes todos os objetos DateInterval eram considerados iguais, a menos que tivessem propriedades.

Intl

O valor padrão do parâmetro das funções idn_to_ascii() e idn_to_utf8() agora é INTL_IDNA_VARIANT_UTS46 em vez do descontinuado INTL_IDNA_VARIANT_2003.

MySQLi

A funcionalidade do servidor incorporado foi removida. Foi quebrado desde pelo menos o PHP 7.0.

A propriedade não documentada mysqli::$stat foi removida em favor de mysqli::stat().

OpenSSL

A função openssl_random_pseudo_bytes() agora lançará uma exceção em situações de erro, semelhante a random_bytes(). Em particular, um Error será lançado se o número de bytes solicitados for menor ou igual a zero, e uma Exception será lançada se não for possível reunir aleatoriedade suficiente. É garantido que o argumento de saída $crypto_strong será sempre true se a função não lançar exceção, portanto, uma verificação explícita não é necessário.

Expressões regulares (Perl-Compatible)

Quando o modo PREG_UNMATCHED_AS_NULL é usado, os grupos de captura sem correspondência à direita agora também serão definidos como null (ou [null, -1] se a captura offset estiver ativada). Isso significa que o tamanho de $matches sempre será o mesmo.

Objetos de dados PHP

A tentativa de serializar uma instância PDO ou PDOStatement agora gerará uma Exception em vez de uma PDOException, consistente com outras classes internas que não oferecem suporte à serialização.

Reflection

Os objetos reflexion agora gerarão uma exceção se for feita uma tentativa de serializá-los. A serialização de objetos reflexion nunca foi suportada e resultou em objetos reflexions corrompidos. Foi explicitamente proibido agora.

Os valores para as constantes das classes ReflectionClassConstant, ReflectionMethod e ReflectionProperty mudaram.

Standard PHP Library (SPL)

Chamar get_object_vars() em uma instância de ArrayObject agora sempre retornará as propriedades do próprio ArrayObject (ou de uma sub classe). Antes, ele retornava os valores do array/object a menos que a flag ArrayObject::STD_PROP_LIST fosse especificado.

Outras operações afetadas são:

  • ReflectionObject::getProperties()
  • reset(), current(), etc. Use os métodos de Iterator em seu lugar.
  • Potencialmente outros trabalhando nas propriedades do objeto como uma lista, por exemplo array_walk().

(array) casts não são afetadas. Eles continuarão retornando o array agrupado, ou as propriedades ArrayObject dependendo se a flag ArrayObject::STD_PROP_LIST é usada.

SplPriorityQueue::setExtractFlags() lançará uma exceção se zero for passado. Antes, isso geraria um erro fatal recuperável na próxima operação de extração.

ArrayObject, ArrayIterator, SplDoublyLinkedList e SplObjectStorage agora oferecem suporte ao mecanismo __serialize() e __unserialize() além da interface Serializable. Isso significa que as payloads de serialização criadas em versões mais antigas do PHP ainda podem ser desserializadas, mas as novas payloads criadas pelo PHP 7.4 não serão entendidas pelas versões mais antigas.

Tokenizer

token_get_all() agora emitirá um token T_BAD_CHARACTER para caracteres inesperados em vez de deixar para trás buracos no fluxo de token.

Incoming Cookies

A partir do PHP 7.4.11, os nomes dos cookies recebidos não são mais decodificados em url por razões de segurança.

add a note add a note

User Contributed Notes 1 note

up
20
happydog at kennel17
3 years ago
Re: "The o serialization format has been removed. As it is never produced by PHP, this may only break unserialization of manually crafted strings."

This little-o serialisation format was used by PHP3 but was never generated by PH PHP4 or above.  The deserialization code still recognised it, though, for reasons of backwards-compatibility with PHP3.

However, based on a bit of investigation, it looks like this code has been broken for about 15 years, so although this is listed as a deprecation, in practice it wasn't.

See this Stack Overflow question for a really great answer, with a lot more detail about this: https://stackoverflow.com/questions/65289729/what-was-phps-o-serialization-format-for
To Top