PHP do Básico ao Avançado – Aula 5 – Estruturas de controle e tomada de decisão

Tempo de Leitura: 8 Minutos

As estruturas de controle, como o próprio nome diz, são as ferramentas que permitem que seu script possa controlar as ações que irá executar de acordo com valores e resultados da análise de expressões, são essas estruturas responsáveis pela tomada de decisão realizada no código e elas que permitem que o script realize ações em respostas as solicitações do usuário, ou a estados e outras funcionalidades. Vamos ver como elas funcionam no PHP, e relacionar isso com a forma que seu script iterage e gera diferentes resultados, conforme os estados encontrados.

Um script PHP pode ser definido como uma série de instruções. Uma instrução pode ser uma atribuição, uma chamada de função, um ‘loop’, uma instrução condicional, ou mesmo uma instrução que não faz nada. Instruções geralmente terminam com um ponto e vírgula. Além disso, as instruções podem ser agrupados em um grupo de comandos através do encapsulamento de um grupo de comandos com chaves. Um grupo de comandos é uma instrução também. Vamos entender o que são essas instruções:

<?php
$a=5; //isso é uma instrução, que atribui o valor 5 a variável $a
$b=date('Y'); // isso é uma instrução que atribui o valor de retorno de date() para a variavel $b
?>

As estruturas de controle, também são instruções, que controlam o fluxo de execução, vamos ver cada uma delas.

if, if else, if elseif else

O IF ou suas variações são a estrutura de controle mais simples que existe,  neste exemplo abaixo, comparamos o dia do aniversário e o mês, com o dia e o mês da data atual, se ambos forem iguais, então exibimos um ‘Feliz Aniversário’ para nosso usuário. Desta maneira, ele não é muito funcional, mais essa variável $aniversario poderia receber o valor de um banco de dados, ou de um formulário de cadastro, e nosso script entenderia que somente se for dia do aniversário ele mostra a mensagem.

<?php
$aniversario='12-09';
if($aniversario==date('d-m')){
 echo '<h1>Feliz Aniversário</h1>';
}
?>

Uma outra maneira de executar uma condição if, é utilizar uma condição para uso caso verdadeiro, e outra condição diferente caso seja falso como na instrução abaixo:

<?php
$a=date('d');
$b=$a%2; // pega o módulo (resto da divisão) por 2 para verificar se é dia par
if($b==0){
   // executa se verdadeiro, ou seja, dia PAR
   echo '<h1> Olá, hoje é um dia par</h1>';
} else {
   // executa se não for dia par
   echo '<h1> Olá, hoje é um dia impar</h1>';
}
?>

Note, que neste segundo exemplo caso o dia seja par, fazemos uma ação, e caso não seja, fazemos outra. Ainda podemos ter uma estrutura do if-else com mais elementos, veja o código abaixo:

<?php
$hora=date('H'); // retorna a hora
if($hora<6){
   echo 'Ainda é madrugada, o que faz aqui?';
} elseif ($hora >=6 and $hora<=12){
   echo 'Bom dia';
} elseif ($hora >12 and $hora<18){
   echo 'Boa tarde';
} else {
   echo 'Boa Noite';
}
?>

Essa estrutura, aqui codificada de maneira simples, permite uma lista de expressões onde a primeira a ser avaliada como positiva será executada, e se nenhuma for positiva será executado o else. NOTA TÉCNICA: O conjunto de controle estrutural if…elseif…else é utilizado frequentemente para avaliar um conjunto de valores, para a mesma expressão, como na estrutura acima, porém, poderíamos ter expressões totalmente independentes, veja o exemplo:

<?php 
$hora=date('H'); // retorna a hora 
$mes=date('m');
if($hora>8 and $hora<18){ 
   echo 'Olá, estou pronto para o trabalho';
} elseif ($mes<6){ 
   echo 'Inicio de ano não é bom para Hora extra, vamos embora?'; 
} else { 
   echo 'Olá, você vai fazer hora extra?'; 
}

Neste segundo exemplo, a primeira expressão que satisfaz a condição é executada, as demais não.Pode haver vários elseifs dentro da mesma declaração if. A primeira expressão elseif (se houver) que retornar TRUE será executada.

Com este tipo de estruturas, finalizamos as opções para uso das condicionais IF e suas variações.Estas podem ser aninhadas até 64 níveis por padrão, gerando uma poderosa estrutura de controle e de análises de expressões.

Switch … Case

A declaração switch é similar a uma série de declarações IF para uma mesma expressão. É usada quando se deseja comparar as mesmas expressão, com uma lista diferente de valores, e executar pedaços diferentes de código dependendo de qual valor é encontrado. Veja como é escrito o código de um Switch basicamente:

<?
switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
    default:
       echo "i is not equal to 0, 1 or 2";
}
?>

Note que o switch executa as instruções em sequencia, até a instrução break seja encontrada, note que se nenhum break for escrito, ele continua executando as operações dos cases subsequentes, iniciando pela primeira instrução dentro do bloco case.

Vamos dar um exemplo prático dessas duas formas de uso, da estrutura switch, neste primeiro caso, vamos usar as instruções break criando uma estrutura que imprima o nome do mês atual, que poderia facilmente ser convertida em uma função que faça isso.

<?php
$i=date('m');
switch($i){
   case 1:
     echo 'Janeiro';
   break;
   case 2:
     echo 'Fevereiro';
   break;
   case 3:
     echo 'Março';
   break;
   case 4:
     echo 'Abril';
   break;
   case 5:
     echo 'Maio';
   break;
   case 6:
     echo 'Junho';
   break;
   case 7:
     echo 'Julho';
   break;
   case 8:
     echo 'Agosto';
   break;
   case 9:
     echo 'Setembro';
   break;
   case 10:
     echo 'Outubro';
   break;
   case 11:
     echo 'Novembro';
   break;
   case 12:
     echo 'Dezembro';
   break;
}
?>

Neste segundo caso, vamos utilizar o Switch sem o break, para criar um sistema de prioridades, que pode ser facilmente convertido em um sistema de níveis de acesso, onde gerente tenha acesso a todas as funções, os coordenadores tenha acesso a uma lista mais limitada, os supervisores a uma lista menor, e os operadores somente as funções básicas.

<?php
$i=2; //0 acesso gerente, 1 acesso coordenador, 2 supervisor, 3 operador
switch($i){
   case 0:
     echo 'Funções Gerente<br>';
   case 1:
     echo 'Funções Coordenador<br>';
   case 2:
     echo 'Funções Supervisor<br>';
   case 3:
     echo 'Funções Operador<br>';
}
?>

Para finalizar, a estrutura switch possui uma instrução default que é executada sempre que não seja encontrada uma avaliação verdadeira, por exemplo:

<?php
$i=5;
switch($i){
   case 0:
     echo 'Não tem registros no banco de dados<br>';
   break;
   case 1:
     echo 'Temos 1 registro que satisfaz sua busca<br>';
   break;
   case 2:
     echo 'Temos 2 registros que satisfazem sua busca<br>';
   break;
   default:
     echo 'Temos mais registros que satisfazem sua busca, dê mais detalhes';
}
?>

Em uma declaração switch, a condição é avaliada somente uma vez, e o resultado é comparado a cada declaração case. Em uma declaração if elseif. a condição é avaliada a cada instrução elseif, e se a condição for mais complicada que uma simples comparação como a saída de uma função ou em um laço pequeno, a declaração switch pode ser mais rápida.

Um detalhe, é que você pode, utilizar Expressões regulares ou Strings nas opções de case, tornando a estrutura Switch uma poderosa ferramente de análise de expressões, e extremamente rápida.

Outras Estruturas e Instruções

GOTO

O operador goto pode ser usado para pular para outra seção do programa. O ponto de destino é definido por um rótulo seguido de dois pontos, e a instrução é usada como goto seguida do rótulo de destino desejado. O uso do goto não é completamente irrestrito. O rótulo de destino deve estar no mesmo arquivo e contexto, significando que não se pode pular para fora ou para dentro de uma função ou método. Também não pode-se saltar para dentro de um laço ou estrutura switch. Pode-se saltar para fora deles, e um uso comum é usar o goto no lugar de um break multi-nível.

Disponível no PHP desde a versão 5.3, é uma instrução que deve ser usada com uma certa cautela, pois o uso exagerado, pode causar um grande problema com a manutenção do código no futuro, na década de 70/80 as instruções GOTO foram consideradas um monstro, porém, atualmente essas visões já não são mais verdadeiras e o uso da instrução pode ser muito útil, principalmente em funções de tratamento de erros.

Considere esse pequeno trecho de checagem de dados, onde queremos retornar um código e uma descrição, de maneira muito mais legível que usando um aninhamento de estruturas:

<?php
  function editaItem($id, $campos)
  {
    $error_code = 0;
    $data = null;
    if(!is_numeric($id))
    {
      $error_code = 1;
      goto end;
    }

    if(!is_array($campos) || !isset($campos["obrigatorios"])
    {
      $error_code = 2;
      goto end;
    }

    $db->update($id, $fields);
    if($db->error())
    {
      $error_code = 3;
      goto end;
    }

    $data = $db->results();

    :end
    return
    [
      "error_code" => $error_code,
      "data" => $data
    ];
  }
?>

BREAK

O break é uma instrução, que interrompe a execução da estrutura ou do looping atual, ou, caso seja usado em uma chamada aninhada, pode ser passado o argumento com o número de estruturas que devem ser interrompidas.

Uma observação é que por exemplo, o break se for usado fora de uma instrução, interrompe a execução do script, finalizando-o. Ou o script também é finalizado caso o número do argumento seja maior que o número de chamadas recursivas ou aninhadas.

O melhor exemplo de uso é dentro da instrução Switch e o uso para interromper aninhamentos está sendo cada vez mais desencorajado para melhorar a legibilidade e manutenção, por isso não vou me preocupar em deixar maiores exemplos com este tipo de uso.

RETURN

A instrução return, é usada para devolver o controle ao módulo anterior (ou finalizar o script caso seja chamada no módulo principal) devolvendo um valor para este retorno, o seu uso mais comum é dentro de funções, porém, pode ser usado dentro de scripts.

No momento, não vamos entrar em maires detalhes, pois teremos uma aula específica sobre funções.

CONTINUE

Outra instrução de controle, é a continue, que pula para a próxima iteração em um looping, vamos voltar a explicação dela, na proxima aula, quando estiver-mos falando sobre as estruturas de repetição.

Conclusão

Nesta aula, estudamos as estruturas usadas para a tomada de decisão e avaliação de expressões, que podem ser consideradas a parte mais importante na programação de computadores, pois essas estruturas é que permitem o controle do fluxo de execução. Vamos continuar nessa trilha, estudando as estruturas de repetição.