A partir da versão 9.8, o Scriptcase e as aplicações geradas são compatíveis com o PHP 8.1.
Abaixo seguem algumas funções que deixarão de funcionar ou tiveram seu funcionamento alterado no PHP 8.1.
1 - Operadores ternários aninhados sem parênteses explícitos
Expressões condicionais de atribuição, usadas de forma aninhada, não são mais permitidas.
Antes do PHP 8:
$result = $aa != "" ? $xxx : isset($bb) && $bb != "" ? $zzz : "";
A partir do PHP 8:
if ($aa != "") {
$result = $xxx;
} elseif (isset($bb) && $bb != "") {
$result = $zzz;
} else {
$result = "";
}
2 - Acesso a valores de array e string usando chaves
O acesso a valor de string e array usando a sintaxe de chaves está depreciado.
Use $var[$idx] ao invés de $var{$idx}.
No PHP 8.1 ao utilizar chave{} para a recuperação de valores do array ocasionará um erro.
Ex:
Antes do PHP 8:
$array = [1, 2];
echo $array[1]; // exibe 2
echo $array{1}; // também exibe 2
$string = "foo";
echo $string[0]; // exibe "f"
echo $string{0}; // também exibe "f"
A partir do PHP 8:
$array = [1, 2];
echo $array[1]; // exibe 2
echo $array{1}; // exibe o erro: Deprecated: Array and string offset access syntax with curly braces is deprecated...
$string = "foo";
echo $string[0]; // exibe "f"
echo $string{0}; // exibe o erro: Deprecated: Array and string offset access syntax with curly braces is deprecated...
3 - Descontinuado: Parâmetros obrigatórios após parâmetros opcionais
A partir do PHP 8 não é mais permitido a declaração de uma função ou um método adicionando um parâmetro obrigatório após parâmetros opcionais.
Isso significa que a seguinte declaração de função resultará num
Notice:
function foo($param_optional = null, $param_required) {
// ^^ optional parameter , ^^ required parameter
}
Exemplo de Notice gerado pelo PHP:
Deprecated: Required parameter $param_required follows optional parameter $param_optional in ... on line ...
4 - Operações aritméticas com strings não numéricos
Até o PHP 7 era possível realizar operações matemáticas com variáveis contendo strings não numéricos , que nesta situação era equivalente ao zero.
No PHP 8.1 este tipo de cálculo passou a apresentar erro.
Antes do PHP 8, o código abaixo não resultaria em um erro:
$b = "";
$a = $b + 2;
No PHP 8, é necessário testar se o valor de $b é uma string numérica ou um número, antes de realizar a operação:
Ex1:
$a = is_numeric($b) ? $b + 2 : 2;
Ex2:
if (!is_numeric($b)) {
$b = 0;
}
$a = $b + 2;
5 - Variáveis e índices inexistentes
Até o PHP 7 havia uma certa tolerância quanto a referência a variáveis ou índices não definidos, gerando apenas um Notice.
No PHP 8, qualquer referência a variável ou índice de array inexistente vai causar um Warning.
Portanto, caso o seu PHP esteja habilitado para exibir Warnings, você vai se deparar com erros para esse contexto.
Para resolver, é necessário testar se uma variável ou índice de array existem, antes de usá-los em alguma operação.
Ex:
$a = isset($b) ? $b + 2 : 2;
6 - Função each()
Retorna o par chave/valor atual de um array e avança o seu cursor.
Esta função foi removida no PHP 8,
caso esteja utilizando em suas aplicações o código deve ser alterado antes de realizar a publicação em um ambiente com PHP 8 ou superior.
Algumas opções de substituição
Ex:
$result = "";
$tab = array(0=>array('tp'=>1,'vl'=>'aaa'),
1=>array('tp'=>2,'vl'=>'bbb'),
2=>array('tp'=>3,'vl'=>'ccc'));
Antes do PHP 8:
while (list ($key, $val) = each($tab)) {
$result .= $tab[$key]["vl"];
}
A partir do PHP 8, usando foreach():
foreach ($tab as $key => $val) {
$result .= $tab[$key]["vl"];
}
7 - Função array_key_exists()
Verifica se uma chave ou índice existe em um array.
Antes do PHP 8:
if (array_key_exists('index', $array1)) {
// codigo
}
A partir do PHP 8:
if (isset($array1['index'])) {
// codigo
}
Formata um número como uma string de moeda.
Esta função foi removida a partir do PHP 8, ela pode ser substituída pela funcionalidade intl
NumberFormatter.
Antes do PHP 8:
echo money_format("%.2n", 1234.56);
A partir do PHP 8:
$currencyObject = new NumberFormatter("pt-BR", NumberFormatter::CURRENCY);
echo $currencyObject->format(1234.56);
9 - Função mb_strrpos()
Localiza a posição da última ocorrência de um valor em uma string.
Passar a codificação como terceiro parâmetro para a função está depreciado.
Em vez disso, passe um offset 0 e a codificação como quarto parâmetro:
Antes do PHP 8:
$string = 'O rato roeu a roupa';
echo mb_strrpos($string, 'roeu', 'UTF-8');
A partir do PHP 8:
$string = 'O rato roeu a roupa';
echo mb_strrpos($string, 'roeu', 0, 'UTF-8');
Lista completa de mudanças do PHP
Para ter a lista completa das mudanças no PHP seguem os links de acordo com a versão do PHP.