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;
?>
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)
?>
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.