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.
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"?
}
}
?>
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.
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)
?>
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)
?>
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());
?>
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"
.
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.
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.
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.
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.
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.
A exportação de Reflection para string agora usa
int
e bool
em vez de
integer
e boolean
, respectivamente.
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.
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.
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.