Tenha o PHP jogando a seu favor

Em: 10/02/2008 Tags: Referencie do seu blog (Trackback)

Recentemente encontrei este cheatsheet que me lembrou de uma característica do PHP que pode se tornar muito útil quando dominada completamente pelo programador: os valores que são avaliados pelo interpretador como false. Em Ruby, por exemplo, apenas false e nil são avaliados como false em expressões booleanas. Em PHP, por outro lado, os seguintes valores são avaliados como false:

  • O valor boolean false
  • O valor null
  • Uma variável não-definida (neste caso o interpretador gera um Notice)
  • Uma string vazia
  • Um array vazio
  • O número zero
  • Uma string que represente o número zero

Você pode e deve tirar proveito dessas regras. Uma prática que sempre emprego é fazer com que métodos ou funções que retornam conjuntos de objetos sempre retornem um array vazio caso nenhum objeto atenda as restrições impostas pelos seus parâmetros. Continue lendo para entender porquê isso pode se tornar útil.

Vamos considerar uma função que retorna todos os usuários de um sistema, e que essa função recebe o parâmetro $age, responsável por restringir a faixa etária dos objetos que serão retornados. A primeira implementação retorna um valor false caso nenhum usuário seja encontrado.

function get_users($age) {
    //...
}

$users = get_users(60);

if ($users) {
    foreach ($users as $user) {
        echo "{$user->get_name()}\n";
    }
}

else {
    echo "Nenhum usuario foi encontrado\n.";
}

Note que precisamos verificar (bloco if-else) se $users não é o valor false, pois o bloco foreach aceita apenas arrays.

A segunda abordagem consiste em fazer com que get_users retorne um array vazio caso nenhum usuário seja encontrado. Veja como fica a nova versão do código:

$users = get_users(60);

foreach ($users as $user) {
    echo "{$user->get_name()}\n";
}

if (!$users) {
    echo "Nenhum usuario foi encontrado\n.";
}

Agora precisamos apenas de um bloco foreach e de um bloco if. Como um array vazio possui valor false dentro de expressões booleanas, tiramos proveito disso para evitar o bloco if-else. Ao bloco foreach nunca será passado um valor inválido, pois ele aceita arrays vazios.

Artigos relacionados:

3 respostas para “Tenha o PHP jogando a seu favor”

  1. Raphael deAlmeida disse:

    Amigo Caio, Essa característica do false no PHP já simplificou muitos códigos pra mim. E ainda tem gente que não gosta e reclama dessa abordagem. Coisas como essa é que tornam o PHP uma linguagem bem flexível e poderosa.

  2. Rafael Souza disse:

    Prefiro como Ruby trata isso, nesse caso pode simplificar, mas tem casos que complica muito, já passei por vários problemas por causa disso.

    Exemplo:

    $array = array(1, 2, 3, 4, false);
    var_dump(in_array(0, $array)); // output: bool (true)
    var_dump(in_array("0", $array)); // output: bool (true)
    var_dump(in_array(null, $array)); // output: bool (true)
    

    Nenhum dos valores estão realmente no array, para “resolver”, a função in_array tem um terceiro parametro que verifica o tipo, então:

    $array = array(1, 2, 3, 4, false);
    var_dump(in_array(0, $array, true)); // output: bool (false)
    var_dump(in_array("0", $array, true)); // output: bool (false)
    var_dump(in_array(null, $array, true)); // output: bool (false)
    

    maaaas, funções que buscam resultados do banco de dados trazem sempre strings para as valores das colunas, independente do tipo definido no banco de dados, então:

    $id = "0";
    $array = array(1, 2, 3, 4, false, null);
    var_dump(in_array((int) $id, $array, true)); // output: bool (false)
    

    ficou mais complicadinho né? mas tem casos e casos, e cada um vê de um jeito ;)

    abraço

  3. Caio Moritz Ronchi disse:

    Certamente, quando o tipo do dado realmente é relevante para o trecho de programa, então o estilo PHP pode levar a resultados inesperados, se o programador não estiver muito atento (e ter que estar sempre atento para programar não é nada divertido nem produtivo). Obrigado pelo exemplo, ilustrou bem a situação oposta, onde o PHP “não joga a seu favor”.

Escreva um comentário (utilize o formato Markdown)