scriptcase.com.br

Compatibilidade para PHP 8.1

A partir da release 9.8, o Scriptcase passa a ser compatível também com o PHP 8.1.


Funções depreciadas e/ou alteradas no PHP 8.1

A partir da versão 9.8, o Scriptcase e as aplicações geradas são compatíveis com o PHP 8.1.

Com esta implementação alguns códigos utilizados em eventos, funções, métodos e bibliotecas (internas ou externas) de suas aplicações podem deixar de funcionar, devido às funções depreciadas ou removidas nas versões mais recentes do PHP. É de responsabilidade do desenvolvedor a correção dos erros decorrentes desta incompatibilidade em códigos utilizados nos eventos ou bibliotecas.

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
foreach
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.
Sua utilização em objetos está depreciada, em seu lugar  devem ser utilizados  isset()  ou  property_exists().

Antes do PHP 8:
if (array_key_exists('index', $array1)) {
	// codigo
}
A partir do PHP 8:
if (isset($array1['index'])) {
	// codigo
}

8 - Função money_format()

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.