sábado, 24 de dezembro de 2011

Entendendo os avisos Undefined Variable e Undefined index

Nesse artigo irei explicar o que significa a mensagem do PHP “Notice: Undefined variable ou Undefined index” e como evitar esse tipo de erro.
Para entender esse tipo de mensagem, observe o exemplo abaixo:

View source
  1. <?php
  2.  
  3. $x = $y + 10;
  4.  
  5. ?>
Executando esse script, que valor deve conter a variável $x?
Você deve responder, impossível dizer, não sei qual é o valor da variável $y. Para o PHP a resposta é a mesma, para ele está sendo feito a seguinte operação internamente:

View source
  1. <?php
  2.  
  3. $x = valor indefinido + 10;
  4.  
  5. ?>
A maneira correta e fazer a seguinte operação:

View source
  1. <?php
  2.  
  3. $y = 5;
  4.  
  5. $x = $y + 10;
  6.  
  7. ?>
ou

View source
  1. <?php
  2.  
  3. $y = 0;
  4.  
  5. $x = $y + 10;
  6.  
  7. ?>
Toda vez que é feita uma operação com uma variável “valor indefinido” o PHP exibe a mensagem Notice: Undefined variable.
Muitas vezes os nossos problemas de programação são mais complexos, pois estamos trabalhando com variáveis passadas por SESSION, GET, POST e outros métodos, para trabalhar dessa forma e necessário avaliar a condição da variável, por exemplo:

View source
  1. <?php
  2.  
  3. if (!isset($y)) {
  4.  
  5. $y = 0;
  6.  
  7. }
  8.  
  9. ?>
Esse script verifica se a variável existe, se a variável não existir é atribuído zero.
Pode ocorrer o mesmo erro quando estamos trabalhando com arrays e tentamos acessar uma posição que não existe, por exemplo:

View source
  1. <?php
  2.  
  3. $info_funcionario = array(
  4.  
  5. "nome" => "Patrick Espake",
  6.  
  7. "profissao" => "Programador");
  8.  
  9. echo $info_funcionario["email"];
  10.  
  11. ?>
No script acima estou tentando acessar o índice “email” no array, esse índice não existe e o PHP exibe a mensagem Notice: Undefined index email.
Você pode fazer a seguinte afirmação: “Já programei assim em PHP e nunca apareceu esse erro!”.
O que acontece é que essas notificações de erros podem ser configuradas no PHP.INI, muitos programadores em ambiente de desenvolvimento deixam configurado para exibir todos os erros e em ambiente de produção deixam configurado para não exibir os erros de notificação.
Para configurar o PHP.INI para mostrar todos os erros, você deve deixar a cláusula error_reporting da seguinte forma:

View source
error_reporting = E_ALL
Para configurar o PHP.INI para não exibir as mensagens de notificação você deve deixar da seguinte forma:

View source
  1. error_reporting = E_ALL & ~E_NOTICE
Em outras linguagens de programação uma variável não inicializada pode conter qualquer coisa, no PHP é considerado como nulo ou como 0 em uma operação aritmética.
Além disso, é mais rápido escrever:

View source
  1. <?php
  2.  
  3. echo $_GET['id'];
  4.  
  5. ?>
do que

View source
  1. <?php
  2.  
  3. if isset($_GET['id'])) echo $_GET['id'];
  4.  
  5. ?>
Em casos extremos você pode usar o @ para ocultar as mensagens de notificação.

View source
  1. <?php
  2.  
  3. @echo $_GET['id'];
  4.  
  5. ?>
Eu considero esse método muito rigoroso, então é melhor fazer o que você acha melhor. Essas notificações podem ajudar durante o desenvolvimento, para detectar determinados erros.

Algumas dicas de PHP

Algumas dicas de PHP que acredito sejam muito uteis para todos nós (ou pelo menos alguns de nós).


1. Usar aspas simples sempre que possível

Ao usar aspas simples no lugar das aspas duplas você evita que o PHP fique vasculhando sua string atrás de variaveis. Isso não só é mais rápido, como também é mais amigável por ajudar a encontrar as variáveis.

E também quando se faz referência a um array que tem um indice de string, sempre use aspas simples. Isso evita que o PHP fique tentando adivinhar o que você quer.

2. Contando os caracteres de uma string

Para fazer isso, geralmente utilizamos a função strlen(). No entanto, existe um método mais rápido. Veja:

"Contagem
View source
  1.  
  2.  
  3.  
  4. <?php
  5.  
  6. $string = 'contando';
  7.  
  8.  
  9.  
  10. if(isset($string[7])){
  11.  
  12. echo "A string '$string' tem pelo menos 7 caracteres.";
  13.  
  14. }else{
  15.  
  16. echo "A string '$string' tem menos de 7 caracteres.";
  17.  
  18. }
  19.  
  20. ?>
  21.  
  22.  
  23.  
  24.  


Você tratou o conteúdo da variável $string como um array ao passá-la com um valor a função isset. Caso esse valor mais 1 seja igual ou maior que 7, retornará verdadeiro. Você deve adicionar 1 pois um array em PHP começa a contagem no zero.

3. Arrays em campos de formulário

Você não apenas pode criar um campo de formulário que cria um elemento de array (como animal['cachorro']), como também pode criar arrays dinâmicos. Isto é bastante útil em checkbox, onde o usuário pode assinalar várias opções. Veja este exemplo:

"Array
View source
<label><input type="checkbox" name="animais[]" value="cachorro" /> Cachorro</label><br />
 
 <label><input type="checkbox" name="animais[]" value="gato" /> Gato</label><br />
 
 <label><input type="checkbox" name="animais[]" value="leao" /> Leão</label><br />
 
 <label><input type="checkbox" name="animais[]" value="tigre" /> Tigre</label><br />


Quando os campos acima forem enviados ao PHP cada animal será adicionado a um array animais. Dessa forma você pode trabalhar o array da maneira que desejar.

4. Usando o echo como uma função

Semprei imaginei que se quisessemos concatenar strings no comando echo do PHP precisariamos usar "." (ponto). Recentemente descobri que podemos tratar o comando echo como uma função, e usar "," (virgula) ao invés do ".". Veja abaixo.


View source
<?php
 
 $string1 = 'Meu nome ';
 
 $string2 = 'é ';
 
 $string3 = 'Bruno';
 
 
 
 echo 'String #1: ', $string1, '<br />';
 
 echo 'String #2: ', $string2, '<br />';
 
 echo 'String #3: ', $string3, '<br />';
 
 ?>
 
 
5. Output Buffering

As vezes temos uma função ou script que mostra algo na tela e queremos reutilizá-la, mas não queremos que seja exibido nada no momento. Podemos evitar que a função ou script exiba algo em determinado momento da seguinte forma:

View source
<?php
 
 ob_start();
 
 
 
 echo 'Mostra na tela!!!';
 
 $guardarconteudo = ob_get_contents();
 
 
 
 ob_end_clean();
 
 
 
 // Faça o que desejar
 
 
 
 echo 'Agora: ' . $guardarconteudo;
 
 ?>
 
 
Espero que tenham gostado das dicas e que sejam uteis para vocês.