Migração scriptcase ambiente php 7.3 para 8.1

Bom dia. Estamos migrando os nossos projetos para o scriptcase 9.13 com PHP 8, e estou tendo alguns problemas:

1 - Em uma aplicação especifica, ao tentar gerar o código fonte, o SC aparece o erro: “undefinied array key b_proximo | script: /var/www/html/scriptcase/devel/class/generator/nmDadosForm.class.php”

2 - Campo do tipo Radio: mesmo havendo um valor default, é necessário defini-lo no evento onLoad para que o comportamento funcione corretamente.

3 - Evento onLoad com condição if/else: ao utilizar um campo do tipo inteiro cujo valor default no banco de dados é 0, ao iniciar a inclusão de um novo registro a variável no evento onLoad está sendo carregada como vazia, e não com o valor padrão esperado.

Alguém já fez a migração e teve esses problemas?

Conversões entre versões do SC geralmente são traumáticas.
Há casos de refazer toda aplicação.

Mesmo dando erro em script não pertencente a aplicação, as diferenças entre as versões do php podem causar erro. Análise o que não pode mais fazer no php 8.1 comparado com Php 7.3.

Aconselho também a procurar no fórum situações parecidas e ler a documentação do php. Pois algumas coisas mudaram do php 7.3 para 8.1 e alguns colegas tiveram que fazer ajustes.

Eu li o material que a netmake preparou e não encontrei no fórum situações parecidas.
O que tá me dando mais trabalho é nos formulários.

Exemplo: Tenho um formulário onde uma flag que o tipo de dados é inteiro e o valor padrão é zero. Mas o SC sempre inicializa ela como string vazia, aí no if(flag == 0) ele não entra, sempre cai no else. Mesmo colocando no evento onscriptinit o valor para 0, quando chega no onload a flag volta para string vazia

Por isso deve-se usar empty() sempre.

Php 8.1 tem problemas em expressões/comparações com variáveis string.

A migração de PHP 7.3 para 8.1 traz mudanças significativas: novas funcionalidades, remoção de recursos antigos e alterações incompatíveis. O ponto crítico é revisar funções descontinuadas, tipos de retorno mais estritos e ajustes em sintaxes que antes eram toleradas.


:key: Principais mudanças entre PHP 7.3 e 8.1

1. Tipagem e Estrutura da Linguagem

  • Tipos mais estritos: PHP 8 introduziu Union Types (int|float) e Intersection Types.
    • Correção: Se funções em 7.3 aceitavam múltiplos tipos sem declaração, agora é recomendável declarar explicitamente.
  • Enums (PHP 8.1): substituem constantes em muitos casos.
    • Correção: Migrar conjuntos de constantes para enum quando fizer sentido.
  • Readonly Properties (8.1): propriedades que só podem ser atribuídas uma vez.
    • Correção: Usar public readonly string $nome; em vez de lógica manual de bloqueio.

2. Funções e Sintaxe

  • Funções descontinuadas:
    • each() foi removida (já obsoleta em 7.2).
      • Correção: substituir por foreach.
    • create_function() não existe mais.
      • Correção: usar closures (function() { ... }).
  • Array e Strings:
    • implode() agora exige ordem correta dos parâmetros (implode($glue, $array)).
    • str_split() e funções similares têm validações mais rígidas.
      • Correção: revisar chamadas com parâmetros inválidos.

3. Erros e Exceções

  • Erros de tipagem agora lançam TypeError em vez de serem silenciosos.
    • Correção: adicionar try/catch em pontos críticos.
  • Warnings promovidos a Errors:
    • Exemplo: acesso a offset em null agora gera Error.
      • Correção: validar variáveis antes de acessar índices.

4. Novos Recursos

  • Fibers (8.1): suporte a concorrência leve.
  • Match Expression (8.0): alternativa mais segura ao switch.
    • Correção: migrar switch simples para match quando possível.
  • Named Arguments: permitem chamadas mais claras.
    • Correção: revisar funções com muitos parâmetros opcionais.

:hammer_and_wrench: Exemplos de Correção

Exemplo 1 – Função each() removida

// Código antigo (PHP 7.3)
while(list($key, $val) = each($array)) {
    echo "$key => $val";
}

// Correção (PHP 8.1)
foreach ($array as $key => $val) {
    echo "$key => $val";
}

Exemplo 2 – Tipagem mais estrita

// PHP 7.3
function soma($a, $b) {
    return $a + $b;
}

// PHP 8.1
function soma(int|float $a, int|float $b): int|float {
    return $a + $b;
}

Exemplo 3 – Acesso inválido em null

// PHP 7.3 (gera Warning)
echo $var['chave'];

// PHP 8.1 (gera Error)
if (is_array($var) && isset($var['chave'])) {
    echo $var['chave'];
}

:rotating_light: Recomendações práticas para migração

  • Rodar testes automatizados antes da atualização.
  • Usar ferramentas como phpstan ou psalm para detectar incompatibilidades.
  • Verificar bibliotecas externas: muitas dependências podem não estar compatíveis com PHP 8.1.
  • Consultar guias oficiais de migração: PHP Migration 8.1.