-
match
agora é uma palavra reservada.
-
mixed
agora é uma palavra reservada, portanto, não pode ser usado para nomear uma classe, interface ou trait, e também é proibido de ser usado em namespaces.
-
As falhas de asserção agora são lançadas por padrão. Se o comportamento antigo é desejado,
assert.exception=0
pode ser definido nas configurações INI.
-
Métodos com o mesmo nome de classe não são mais interpretados como construtores. O
método __construct() deve ser utilizado em seu lugar.
-
A capacidade de chamar métodos não estáticos estaticamente foi removida. Por isso
a função is_callable() irá falhar ao verificar um método não estático com
um nome de classe (deve se realizar uma verificação com uma instância de objeto).
-
Foram removidas as conversões de tipos, (real)
e (unset)
.
-
A diretiva do php.ini track_errors foi removida. Isto
significa que a variável php_errormsg não está mais disponível. A função
error_get_last() deve ser utilizada em seu lugar.
-
A capacidade de definir constantes que não diferenciam maiúsculas de minúsculas foi removida. O
terceiro argumento para a função define() não pode ser mais true
.
-
A capacidade de especificar um auto carregamento utilizando a função __autoload() foi
removida. A função spl_autoload_register() deve ser utilizada em seu lugar.
-
O argumento errcontext
não será mais usado para manipulação de erros personalizados
definido com a função set_error_handler().
-
A função create_function() foi removida. Ao invés disso, funções anônimas devem ser utilizadas.
-
A função each() foi removida. foreach ou ArrayIterator
devem ser utilizados em seu lugar.
-
Foi removida a capacidade de desvincular this de closures que foram
criadas a partir de um método, usando Closure::fromCallable() ou
ReflectionMethod::getClosure().
-
A habilidade de desvincular this de closures que contêm usos de
this também foi removida.
-
A habilidade de utilizar a função array_key_exists() com objetos foi removida.
as funções isset() ou property_exists() devem ser usadas em seu lugar.
-
O comportamento da função array_key_exists() com relação ao tipo do parâmetro
key
agora é consistente com a função isset() e
acesso normal à arrays. Todos os tipos de chave agora usam as coerções usuais e as chaves de
array/objeto lançam um TypeError.
-
Qualquer array com número n em sua primeira posição utilizará
n+1 em sua próxima chave implícita mesmo se n
for negativo.
-
O nível de error_reporting padrão agora é E_ALL
. Anteriormente excluía
E_NOTICE
e E_DEPRECATED
.
-
display_startup_errors agora é habilitado por
padrão.
-
Usar parent dentro de uma classe sem pai agora produzirá um erro fatal
em tempo de execução.
-
O operador @
não irá mais silenciar erros fatais
(E_ERROR
, E_CORE_ERROR
,
E_COMPILE_ERROR
, E_USER_ERROR
,
E_RECOVERABLE_ERROR
, E_PARSE
). Manipuladores de erros que
esperam que error_reporting seja 0
quando @
é usado, devem
ser ajustados para usar uma verificação de máscara:
<?php
// Substituir isso ...
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (error_reporting() == 0) {
return false;
}
// ...
}
// ... por isso:
function my_error_handler($err_no, $err_msg, $filename, $linenum) {
if (!(error_reporting() & $err_no)) {
return false;
}
// ...
}
?>
Adicionalmente, cuidados devem ser tomados para que mensagens de erro não sejam mostradas
no ambiente de produção, o que pode resultar em vazamento de informações. Certifique-se
de que a diretiva display_errors=Off
seja usada em conjunto com o log de erros.
-
#[
não é mais interpretado como o início de um comentário,
já que esta sintaxe é utilizada agora para atributos.
-
Erros de herança devido a assinaturas de método incompatíveis (violações de LSP) agora sempre gerarão
um erro fatal. Antes, um aviso era gerado em alguns casos.
-
A precedência dos operadores de concatenação foi modificada em relação ao bitshifts tanto na adição
como na subtração.
<?php
echo "Sum: " . $a + $b;
// Era interpretado como:
echo ("Sum: " . $a) + $b;
// e passa a ser interpretado como:
echo "Sum:" . ($a + $b);
?>
-
Argumentos com um valor padrão que avaliam null
em tempo de execução, não irão mais marcar
o tipo do parâmetro como implícito. Um tipo explícito nulo, ou explicitamente null
como argumento padrão
deve ser usado em seu lugar.
<?php
// Subistituir
function test(int $arg = CONST_RESOLVING_TO_NULL) {}
// Por isso
function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
// Ou isso
function test(int $arg = null) {}
?>
-
Uma série de avisos foram convertidos para exceções do tipo Error:
-
A tentativa de escrita em uma propriedade de um não-objeto. Anteriormente isso
criava implicitamente um objeto stdClass para strings nulas, falsas e vazias.
-
A tentativa de anexar um elemento a um array para a qual a chave PHP_INT_MAX
já está em uso.
-
Tentar usar um tipo inválido (array ou objeto) como uma chave de array ou
deslocamento de string.
- A tentativa de escrever em um índice de array de um valor escalar.
- Tentar descompactar um não-array/Traversable.
-
Tentar acessar constantes não qualificadas que são indefinidas.
Anteriormente, os acessos constantes não qualificados resultavam em um aviso e eram interpretados como strings.
-
Passar o número errado de argumentos para uma função sem argumento variadic
ira lançar uma exceção ArgumentCountError.
-
Passar tipos contáveis inválidos para count() irá lançar
uma exceção TypeError.
Uma série de notificações foram convertidas em avisos:
- A tentativa de leitura em uma variável não definida.
- A tentativa de leitura em uma propriedade não definida.
- A tentativa de leitura em uma chave de array não definido.
- A tentativa de leitura em uma propriedade de um não-objeto.
- A tentativa de acesso em um índice de array em um não-array.
- A tentativa de conversão de um array para uma string.
- A tentativa de usar um resource como uma chave de array.
- A tentativa de usar null, um booleano ou um número de ponto flutuante(float) como uma posição em uma string.
- A tentativa de leitura em uma posição fora dos limites de uma string.
- A tentativa de atribuir uma string vazia a uma posição de uma string.
-
A tentativa de atribuir múltiplos bytes em uma posição de uma string agora emite um aviso.
-
Caracteres inesperados no código fonte (como bytes NUL fora de strings) agora irá resultar em uma
exceção ParseError em vez de um aviso do compilador.
-
As exceções não capturadas agora passam por "desligamento limpo", o que significa que os destrutores são chamados
após uma exceção não detectada.
-
O erro fatal em tempo de compilação "Only variables can be passed by reference" foi adiado até o
tempo de execução, e convertido em uma exceção de Error
"Argument cannot be passed by reference".
-
Alguns alertas do tipo "Only variables should be passed by reference" foram convertidas para
exceções do tipo "Argument cannot be passed by reference"
-
O nome gerado para classes anônimas foi modificado. Agora, inclui o nome da primeira classe ou
interface:
<?php
new class extends ParentClass {};
// -> ParentClass@anonymous
new class implements FirstInterface, SecondInterface {};
// -> FirstInterface@anonymous
new class {};
// -> class@anonymous
?>
O nome mostrado acima ainda é seguido por um byte NUL e um sufixo único.
-
As referências de método de traits não absolutas em adaptações de alias de traits agora precisam ser
inequívocas:
<?php
class X {
use T1, T2 {
func as otherFunc;
}
function func() {}
}
?>
Se T1::func()
e T2::func()
existem, este código anteriormente era
aceito de forma silenciosa e func assumia referência a T1::func
. Agora irá gerar um
erro fatal, e T1::func
ou T2::func
precisam ser
escritos explicitamente.
-
A assinatura de métodos abstratos definido nas características agora é verificada no método de implementação
da classe:
<?php
trait MyTrait {
abstract private function neededByTrait(): string;
}
class MyClass {
use MyTrait;
// Erro por conta do retorno desalinhado.
private function neededByTrait(): int { return 42; }
}
?>
-
Funções desabilitadas agora são tratadas da mesma forma que funções não existentes. Ao chamar
uma função desabilitada será informado que ela é desconhecida, e redefinir uma função desabilitada agora é possível.
-
Os stream wrappers data://
não podem mais ser writable (gravável), indo
de encontro ao comportamento documentado.
-
Os operadores aritméticos e bitwise (bit a bit) +
, -
,
*
, /
, **
, %
,
<<
, >>
, &
,
|
, ^
, ~
, ++
,
--
irão agora apresentar um TypeError quando um dos
operandos estiver em um array, resource ou em um object não sobrecarregado (non-overloaded). A única exceção a isto é
a operação de mesclagem de array com +
, que permanece suportada.
-
A conversão de float para string agora sempre terá o mesmo comportamento, independentemente da localidade.
<?php
setlocale(LC_ALL, "de_DE");
$f = 3.14;
echo $f, "\n";
// Anteriormente: 3,14
// Agora: 3.14
?>
Veja as funções printf(), number_format() e
NumberFormatter() para customizar a formatação de números.
-
O suporte para chaves (curly braces), cujo uso para acesso de deslocamento estava descontinuado, foi removido.
<?php
// Ao invés de:
$array{0};
$array{"key"};
// Usar:
$array[0];
$array["key"];
?>
-
Aplicar o modificador final ou método privado agora irá produzir um aviso, a menos que o método
seja o construtor.
-
Se um objeto construtor chama a função exit(), o objeto destrutor não será chamado.
Isto vai de encontro ao comportamento que o construtor lança.
-
Nomes de Namespace não podem mais conter espaços em branco: Enquanto Foo\Bar
será reconhecido
como um nome de Namespace, Foo \ Bar
não será. Por outro lado, as palavras-chave agora serão
permitidas como segmentos de um namespace, o que permite a mudança na interpretação do código:
new\x
agora é o mesmo que constant('new\x')
,
e não new \x()
.
-
Os ternários aninhados agora exigem parênteses explícitos.
-
debug_backtrace() e Exception::getTrace() agora não mais
apresentam referências aos argumentos. Não será possível mudar os argumentos de uma função
através de um backtrace.
-
O uso de strings numéricas foi modificado para ser mais intuitivo e menos sujeito a erros. Seguindo
os espaços em branco, é permitido agora strings numéricas para tratamento de consistência contendo espaços em branco.
Isso afeta principalmente:
- A função is_numeric()
- Comparações string a string
- Declaração de tipos
- Operações de incremento e decremento
O conceito de um "leading-numeric string" foi praticamente abandonado; os casos onde permanecem
são para facilitar a migração. Strings que emitem um E_NOTICE
"A non
well-formed numeric value encountered" agora emitirão um E_WARNING
"A
non-numeric value encountered" e todas as strings que emitiram um E_WARNING
"A
non-numeric value encountered" agora lançarão um erro
TypeError. Isso afeta principalmente:
- Operações aritméticas
- Operações bit a bit
Esta mudança do E_WARNING
para TypeError também afeta o
E_WARNING
"Illegal string offset 'string'" para o posicionamento ilegal de strings. O
comportamento de conversões explícitas de strings para int/float não foi alterado.
-
Métodos mágicos agora podem ter argumentos e retornar tipos verificados se eles foram declarados.
As assinaturas devem corresponder à seguinte lista:
__call(string $name, array $arguments): mixed
__callStatic(string $name, array $arguments): mixed
__clone(): void
__debugInfo(): ?array
__get(string $name): mixed
__invoke(mixed $arguments): mixed
__isset(string $name): bool
__serialize(): array
__set(string $name, mixed $value): void
__set_state(array $properties): object
__sleep(): array
__unserialize(array $data): void
__unset(string $name): void
__wakeup(): void
-
As chaves do array passados para a função call_user_func_array() agora podem ser interpretadas
como nomes de parâmetros, em vez de serem silenciosamente ignoradas.
-
A declaração da função chamada assert()
dentro de um namespace não é
mais permitida e gera um E_COMPILE_ERROR
.
A função assert() recebe um tratamento especial pelo motor do PHP,
o que pode levar a comportamentos inconsistentes quando definido como uma função de namespace com o mesmo nome.