Como resolver o erro "compact: Undefined variable" no PHP

Erro e Causa

O erro em questão é esse:

compact(): Undefined variable "variavel" in script.php on line 3

A mensagem na verdade é um E_NOTICE (mensagem de erro do PHP) disparado quando você tenta chamar a função compact em uma variável não existente no escopo atual. Esse erro ocorre apenas em versões igual ou superiores ao php 7.3.

Reproduzindo o erro

Para reproduzir o erro, basta adicionar uma variável que não existe como argumento de compact.

$existe = 'existe';
compact('existe', 'nao_existe');

Possíveis soluções

Para resolver esse problema, podemos utilizar algumas alternativas.

Atualizar o código

Se possível, você deve atualizar o código, passando a usar como argumento da função compact apenas as variáveis existentes no escopo em que esta função é chamada. Dessa forma, você estará adequanto seu código ao novo comportamento da função, evitando a mensagem de erro.

Exemplo:

$existe = 'existe';
compact('existe');

Fazer o downgrade para a versão 7.2 do PHP

Caso esteja utilizando uma biblioteca que não possa ser atualizada, talvez seja melhor fazer o downgrade para a versão 7.2 do PHP. Pois esse comportamento de compact passou a ocorrer a partir da versão 7.3.

Desativar o E_NOTICE

Alternativamente, você pode desativar o E_NOTICE para suprimir a mensagem de erro causada pelo compact.

Veja:

error_reporting(E_ALL ^ E_NOTICE);
$existe = 'existe';
compact('nao_existe', 'existe');    // ['existe' => 'existe']

Utilizar a supressão de erro do PHP

Bem, não é uma das minhas alternativas favoritas, mas você pode utilizar o @ antes de chamar compact. Isso vai suprimir a mensagem de erro, fazendo com que o PHP simplesmente ignore a variável não existente.

// Fazer o que né?
$existe = 'existe';
@compact('nao_existe', 'existe'); // ['existe' => 'existe']