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

PHP Core

Interpretação do rótulo de finalização Heredoc/Nowdoc

Devido à introdução da sintaxe flexível heredoc/nowdoc, doc strings que contêm o rótulo final dentro de seu corpo podem causar erros de sintaxe ou alteração na interpretação. Por exemplo em:

<?php
$str = <<<FOO
abcdefg
   FOO
FOO;
?>
A ocorrência recuada de FOO não tinha anteriormente nenhum significado especial. Agora será interpretado como o final da string heredoc e o seguinte FOO; causará um erro de sintaxe. Esse problema sempre pode ser resolvido escolhendo um rótulo final que não ocorra no conteúdo da string.

Continuar problemas com o comutador de segmentação Warning

As instruções continue direcionadas às estruturas de fluxo de controle do switch agora gerarão um aviso. Em PHP, tais instruções continue são equivalentes a break, enquanto se comportam como continue 2 em outras linguagens.

<?php
while ($foo) {
    switch ($bar) {
      case "baz":
         continue;
         // Warning: "continue" targeting switch is equivalent to
         //          "break". Did you mean to use "continue 2"?
   }
}
?>

Interpretação estrita de chaves de strings inteiras em ArrayAccess

Acessos de matriz do tipo $obj["123"], onde $obj implementa ArrayAccess e "123"" é uma string literal de inteiro não resultará mais em uma conversão implícita para inteiro, ou seja, $obj->offsetGet("123") será chamado em vez de $obj->offsetGet(123). Isso corresponde ao comportamento existente para não literais. O comportamento dos arrays não é afetado de forma alguma, eles continuam a converter implicitamente chaves de string integrais em inteiros.

Propriedades estáticas não são mais separadas por atribuição de referência

No PHP, as propriedades estáticas são compartilhadas entre as classes herdadas, a menos que a propriedade estática seja explicitamente substituída em uma classe filha. Porém, devido a um artefato de implementação foi possível separar as propriedades estáticas atribuindo uma referência. Essa brecha foi corrigida.

<?php
class Test {
    public static $x = 0;
}
class Test2 extends Test { }

Test2::$x = &$x;
$x = 1;

var_dump(Test::$x, Test2::$x);
// Previously: int(0), int(1)
// Now:        int(1), int(1)
?>

Referências retornadas por Array e Property Accesss são imediatamente desempacotadas

As referências retornadas por acessos de array e propriedade agora são desempacotadas como parte do acesso. Isso significa que não é mais possível modificar a referência entre o acesso e o uso do valor acessado:

<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Previously: int(4), Now: int(3)
?>
Isso torna consistente o comportamento de referências e não referências. Observe que ler e escrever um valor dentro de uma única expressão permanece um comportamento indefinido e pode mudar novamente no futuro.

Argumento de descompactação de Traversables com chaves não inteiras não é mais suportada

A descompactação de argumentos parou de funcionar com Traversables com chaves não inteiras. O código a seguir funcionou no PHP 5.6-7.2 por acidente.

<?php
function foo(...$args) {
    var_dump($args);
}
function gen() {
    yield 1.23 => 123;
}
foo(...gen());
?>

Diversos

O utilitário ext_skel foi completamente redesenhado com novas opções e algumas opções antigas removidas. Isso agora é escrito em PHP e não possui dependências externas.

O suporte para BeOS foi descartado.

Exceções lançadas devido à conversão automática de avisos em exceções no modo EH_THROW (por exemplo, algumas exceções DateTime) não preenchem mais o estado error_get_last(). Dessa forma, eles agora funcionam da mesma maneira que as exceções lançadas manualmente.

TypeError agora relata tipos errados como int e bool em vez de integer e boolean, respectivamente.

As variáveis indefinidas passadas para compact() agora serão relatadas como um aviso.

getimagesize() e funções relacionadas agora relatam o tipo mime de imagens BMP como image/bmp em vez de image/x-ms-bmp, já que o primeiro foi registrado na IANA (consulte » RFC 7903).

stream_socket_get_name() agora retornará endereços IPv6 entre colchetes. Por exemplo, "[::1]:1337" será retornado em vez de "::1:1337".

BCMath Matemática de Precisão Arbitrária

Todos os avisos lançados pelas funções BCMath agora estão usando o tratamento de erros do PHP. Anteriormente, alguns avisos eram gravados diretamente no stderr.

bcmul() e bcpow() agora retornam números com a escala solicitada. Anteriormente, os números retornados podem ter omitido zeros decimais à direita.

IMAP, POP3 e NNTP

Os logins rsh/ssh são desabilitados por padrão. Use imap.enable_insecure_rsh se quiser ativá-los. Observe que a biblioteca IMAP não filtra os nomes das caixas de correio antes de passá-los para o comando rsh/ssh, portanto, passar dados não confiáveis para essa função com rsh/ssh ativado é inseguro.

Multibyte String

Devido ao suporte adicional para capturas nomeadas, os padrões mb_ereg_*() usando capturas nomeadas se comportarão de maneira diferente. Em particular, as capturas nomeadas farão parte das correspondências e mb_ereg_replace() interpretará a sintaxe adicional. Consulte Capturas nomeadas para obter mais informações.

Melhorias na extensão MySQL

As instruções preparadas agora relatam corretamente os segundos fracionários para as colunas DATETIME, TIME e TIMESTAMP com especificador de decimais (por exemplo, TIMESTAMP(6) ao usar microssegundos). Anteriormente, a parte dos segundos fracionários era simplesmente omitida dos valores retornados.

Funções do MySQL (PDO_MYSQL)

As instruções preparadas agora relatam corretamente os segundos fracionários para as colunas DATETIME, TIME e TIMESTAMP com especificador de decimais (por exemplo, TIMESTAMP(6) ao usar microssegundos). Anteriormente, a parte dos segundos fracionários era simplesmente omitida dos valores retornados. Observe que isso afeta apenas o uso de PDO_MYSQL com preparações emuladas desativadas (por exemplo, usando a funcionalidade de preparação nativa). Declarações usando conexões com PDO::ATTR_EMULATE_PREPARES=true (que é o padrão) não foram afetadas pelo bug corrigido e já obtiveram os valores de segundos fracionários apropriados do mecanismo.

Reflection

A exportação de Reflection para string agora usa int e bool em vez de integer e boolean, respectivamente.

Standard PHP Library (SPL)

Se um autoloader SPL lançar uma exceção, os seguintes autoloaders não serão executados. Anteriormente, todos os autoloaders eram executados e as exceções eram encadeadas.

SimpleXML

Operações matemáticas envolvendo objetos SimpleXML agora tratarão o texto como um int ou float, o que for mais apropriado. Anteriormente, os valores eram tratados como ints incondicionalmente.

Cookies recebidos

A partir do PHP 7.3.23, os nomes dos cookies recebidos não são mais decodificados por url por motivos de segurança.