PHP para Iniciantes: Operador de Controle de Erro

Este será o artigo menos consumado desta série, assim espero, pois é convenientemente utilizado em fluxos onde há pouco controle de código, geralmente gambiarras. Se você entende plenamente o que está ocorrendo no script, não vai ter necessidade sequer de conhecer esse operador, concorda?

Então por que você vai falar sobre isso, Kiko?

Porque a vida de um desenvolvedor não se limita a criar, mas também dar manutenção. E muitas vezes você irá dar manutenção em código alheio, onde poderá encontrar esse operador colocado lá. Saber o que ele faz é essencial para ter uma visão de possíveis brechas de lógica. Vamos nessa?

Operador @

É um operador que tem como único objetivo suprimir os erros da expressão que estiver à direita dele. Antes da existência do null coalescing e do nullsafe operator (tudo bem não saber o que é), os desenvolvedores usaram o supressor de erros como tratativa para obter o dado nulo quando algo não existe.

Um exemplo:

<?php

class Exemplo
{
    public function buscarPessoa()
    {
        if (rand(0,1)) {
            return (object) ['nome' => 'Joaquim'];
        }
        return null;
    }
}

$exemplo = new Exemplo();

$nome = $exemplo->buscarPessoa()->nome;

O método buscarPessoa pode retornar um objeto ou null, o que significa que a última sentença pode dar muito certo ou muito errado. Null coalescing e nullsafe operator servem para contornar facilmente essa situação, mas é fato que antes nenhum deles existia... Então você poderia suprimir erros ou fazer verificações. O que popularizou?

Suprimir erros

// (...)

$nome = @$exemplo->buscarPessoa()->nome;

// se buscarPessoa() retorna null, o PHP não consegue acessar a propriedade "nome" no null
// então dispara um erro
// mas com a supressão de erro, ele apenas continua com o valor que tem até então: null
// daí, $nome = null

var_dump($nome); // NULL ou string(Joaquim)

Se quiser testar isso à vera, troque a passagem rand(0,1) por false e aí vai cair sempre no caso nulo.

Obs. 1: a supressão de erros pelo operador @ só funciona para a expressão que está à sua direita, não para os escopos internos executados junto com a expressão. Por exemplo, aquele erro de null coalescing só é capturado pois é disparado na mesmíssima linha onde está o @. Se o erro fosse interno do método buscarPessoa(), a supressão falharia.

Obs. 2: se a flag track_errors estiver ativada no php.ini, todos os erros que o interpretador gera (incluindo os suprimidos pelo operador) serão colocados na variável mágica $php_errormsg. Isso ajuda, de certo modo, a separar as tratativas do fluxo de sucesso do fluxo de erros.

E como seria com verificações, Kiko?

// (...)

$pessoa = $exemplo->buscarPessoa();
$nome = $pessoa ? $pessoa->nome : null; // equação ternária, caso não conheça

E contando com o nullsafe operator, seria ainda melhor, bastando adicionar uma interrogação:

// (...)

$nome = $exemplo->buscarPessoa()?->nome;
// a interrogação tá logo depois do buscarPessoa!!

var_dump($nome);

Outra forma de fazer, com null coalescing:

// (...)

$pessoa = $exemplo->buscarPessoa();
$nome = $pessoa->nome ?? null; // nesse caso, a ideia é colocar um valor padrão no lugar de null

var_dump($nome);

Agora que contamos com essas ferramentas iradíssimas (nullsafe operator e null coalescing), não vejo quaisquer outros motivos para suprimir erros com o operador @, exceto se tá rolando um erro em produção e que precisa ser tirado do ar antes de qualquer entendimento sobre o que está acontecendo. Nesse tipo de situação, qualquer medida é tolerável, desde que você se comprometa a desfazer todos os débitos técnicos depois (e que suas lideranças te permitam arranjar tempo para isso, claro).

Não julgo ninguém que sobrevive em ambientes onde tudo é prioridade, menos a qualidade de código. Se você está nessa situação, continue estudando! Algum dia isso passa, confia em mim, rs.

E por hoje é só! Acho que deixei bem claro que não deve usar esse operador, certo? Siga bem caminhoneiro esse conselho e tudo vai ficar bem.

No próximo artigo, falaremos sobre um Operador de execução, que é uma conexão entre o interpretador e o shell do sistema operacional. Com ele, você pode facilmente executar comandos no computador, fora do PHP. Parece legal? Hehehe, mas deixar isso em qualquer parte no código pode abrir uma bela de uma brecha de segurança, então é mais uma coisa para evitarmos. Porém às vezes aparece uma necessidade desse carinha - necessidades reais de produto. Então ele é mais aceito do que o do mencionado no artigo de hoje, beleza?

Nos vemos em breve!

Inté!