PHP Higienizando Variáveis com Operador Elvis ?:

function defaultValues(int $index, string $sku, string $code, string name, int $quantity, float $price)
    $index = $index ?: 1;
    $sku = $sku ?: 'NOT INFORMED';
    $code = $code ?: 'NOT INFORMED';
    $name = $name ?: 'NOT INFORMED';
    $quantity = $quantity ?: 0;
    $price = $price ?: 0.0;
}

Há algum tempo eu vinha observando em meus códigos um uso excessivo do operador ternário para limpeza e padronização de variáveis, dai recentemente eu dei uma olhada com mais carinho no operador Elvis. Em alguns artigos eu encontrei explicações de que ele seria a parte FALSE do operador ternário, mas eu nunca tinha aplicado ele na prática de uma forma tão contundente.

Então surgiu uma nova oportunidade e fui olhar a documentação novamente e “voila”. Não é que serviu direitinho pra fazer higienização de variáveis?!

Mas por que não usar o operador ternário? Porque a higienização requer uma ação apenas e o ternário exige duas.

E o operador Null Coalesce? Bom, o null coalesce testa somente nulls e no meu caso conteúdo vazio também precisaria ser higienizado.

A melhor opção então recaiu sobre o operador Elvis, por que ele executa ação para todo e qualquer conteúdo avaliado como FALSEY. Grosseiramente falando o FALSEY equivale a qualquer conteúdo convertido para boolean que resulta em falso… veja os exemplos abaixo:

var_dump(null ?: 'null is falsey');      // "null is falsey"
var_dump(true ?: 'true is truthy');      // bool(true)
var_dump(false ?: 'false is falsey');    // "false is falsey"
var_dump('' ?: 'empty string is falsey');// "empty string is falsey"
var_dump(' '?: 'space is truthy');       // " "
var_dump(empty(null) ?: 'empty null is truthy'); // bool(true)
var_dump(0 ?: 'zero int is falsey');     // "zero int is falsey"
var_dump(0.0 ?: 'zero float is falsey'); // "zero float is falsey"

Agora compare os resultados com o NULL COALESCE…

var_dump(null ?? 'null is coalesced');        // "null is coalesced"
var_dump(true ?? 'true is not coalesced');    // bool(true)
var_dump(false ?? 'false is not coalesced');  // bool(false)
var_dump('' ?? 'empty string is not coalesced'); // ""
var_dump(' ' ?? 'space is not coalesced');       // " "
var_dump(empty(null) ?? 'empty null is not coalesced'); // bool(true)
var_dump(0 ?? 'zero is not coalesced');         // int(0)
var_dump(0.0 ?? 'zero float is not coalesced'); // float(0)

Claramente a escolha correta é usar o operador Elvis para a higienização pois nulls, zeros integer or float, boolean false, empty string, todos sem excessão irão disparar a ação para higienização, evitando assim o uso de ifs e outros testes desnecessários.

Happy CleanCode!

Elvis Operator