É @ $ array um anti-padrão?

É bom usar @ ao extrair um valor possivelmente perdido de uma matriz PHP? Exemplo:

$value = @$array['possibly_missing_key']; 

O comportamento pretendido:

 if (isset($array['possibly_missing_key'])) { $value = $array['possibly_missing_key']; } else { $value = null; } 

Eu quero saber, antes de espalhar o padrão de uso.

O operador @ suprime as mensagens de erro, e o uso potencialmente configura seu código para outros erros e comportamentos inesperados que acabam por ser difíceis de rastrear. Assim, é certamente um antipattern.

Assim, eu preferiria o segundo bit. Isso torna muito mais claro

  • que pode não estar presente na matriz, e
  • qual o valor padrão se não estiver presente

Para torná-lo mais conciso, você pode usar o operador condicional ternário ?: , como visto na resposta de Mark Baker . Ligeiramente menos código e mais símbolos, mas o significado é bem reconhecido.

Na verdade, a variação do isset é o anti-padrão. Se você apenas usa isset($var)?$var:NULL com a intenção de suprimir o “erro”, então você não conseguiu nada usando a syntax adequada para a supressão de erros. Tem o mesmo resultado, mas é menos legível.

As pessoas estão defendendo isso por causa da “limpeza” percebida e porque usar isset é uma microatividade. Evitar @ e usar isset como substituição de sal sintática é apenas programação de culto de carga.

Ou

 $value = (isset($array['possibly_missing_key'])) ? $array['possibly_missing_key']: null; 

Ignorar avisos é definitivamente um antipattern; então sim, é um anti-padrão (e posso garantir que, se você aprender a suprimir avisos, um deles voltará e morda-lo na parte posterior, senão pior).

Além disso, enquanto a segunda versão é mais detalhada, ele fornece a variável não inicializada um estado conhecido (ou pode ser usado para lidar com o problema, se a variável deve ser preenchida).

A terceira opção:

 $value = (isset($array['key']) ? $array['key'] : null); 

Eu sei que isso não responde diretamente à pergunta; Eu teria colocado isso como um comentário, exceto que realmente precisava ser formatado.

A idéia aqui é que, se você estiver tentando tornar o seu código mais curto usando um one-liner em vez de um bloco if-else, então você ainda pode obtê-lo em um one-liner sucinto usando um operador ternário, dando-lhe o melhor dos dois mundos.

O segundo bloco de código (ou a alternativa de Mark Baker que funcionará exatamente o mesmo) é melhor. Não estou inteiramente certo sobre o PHP, mas em muitas outras linguagens de programação, simplesmente ignorar uma variável quase definitivamente provocará um erro. Pelo menos com o segundo bloco você está inicializando a variável para algum valor ou local de memory.

A supressão de erros deve ser mais comumente usada se você espera que uma function apresente um erro esperado no produto final (no entanto, na maioria das vezes isso não será o caso).

Boa sorte!
Dennis M.