Tenha o PHP jogando a seu favor
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.

February 11th, 2008 às 9:37 am
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.
June 25th, 2008 às 10:06 am
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:
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:
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:
ficou mais complicadinho né? mas tem casos e casos, e cada um vê de um jeito
abraço
June 25th, 2008 às 10:24 am
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”.