PHP para Iniciantes: Estruturas de Controle - Introdução

Olá, leitor(a) da minha taverninha. Fiquei uns dias longe aqui, né? Precisei resolver umas broncas da vida mas jaja normaliza tudo. Talvez eu faça uma publicação só contando um pedaço da minha vida pessoal, mas esse artigo aqui é exclusivo do PHP 🐘! Ainda assim, encorajo qualquer pessoa a trocar uma ideia comigo no Twitter, eu sempre respondo todo mundo. Fechado?!

E o artigo de hoje é sobre Estruturas de Controle, uma introdução a essa nova seção iradíssima. Se você já codou em outras linguagens de programação, provavelmente já conhece tudo... No máximo vai aprender a sintaxe das coisas no PHP. Mas como gosto de reforçar em todo artigo: estou direcionando essas publicações para iniciantes, então eu vou falar como se você não soubesse de nada e o que não for novidade pra você, é só pular, ok?! Vamos lá.

Ok, Kiko, mas o que é uma estrutura de controle? O que exatamente eu controlo?

Essa é uma pergunta específica demais para um começo. Se eu simplesmente respondesse, o artigo acabaria agora, concorda? :hehe:

O nome pode não fazer sentido, mas fará. É uma questão de interpretação. Por exemplo, sabemos que em toda linguagem de computação, nós, programadores, escrevemos instruções para que algum interpretador traduza em instruções de máquina para computar, certo? Eu falei sobre isso lá no segundo artigo, Sintaxe básica - Tags. E, assim como várias outras linguagens espalhadas aí pelo nosso mundo, as instruções no PHP são linhas de comando, onde cada instrução acaba em um ponto-e-vírgula (;).

Só que nem sempre uma instrução se resume a isso. A essa altura, é possível perceber que uma instrução pode ter muitas outras instruções dentro dela. É o que rola quando chamamos uma função, por exemplo:

<?php

echo 'instrução 1';

function blocoInstrucoes()
{
    echo 'instrução interna 1';
    echo 'instrução interna 2';
}

echo 'instrução 2';
blocoInstrucoes(); // executa as duas instruções dentro

Então uma função é uma estrutura de controle, Kiko?

Não... Uma função é uma função, ué. Eu ainda não terminei, calma aí!

O ponto é: ao criar um conjunto de instruções, você sutilmente perceberá uma necessidade de controlar quando aquele bloco precisa ser acionado. É aí: onde entra o termo "estrutura de controle".

Resumindo, são estruturas que servem para controlar quando um bloco deve ou não ser chamado. Você até pode ter esse controle com as funções, mas o papel é totalmente diferente: uma função é um bloco de instruções que é executado quando acionada. Se há necessidade de controlar quando a função deve ser chamada, aí sim, você provavelmente irá colocar a chamada dela dentro de uma estrutura de controle. Por isso que funções são apenas funções.

Momento spoiler

Nós já brincamos bastante com estruturas de controle em exemplos anteriores. Infelizmente é impossível falar de programação sem mencionar coisas antes do tempo... Ainda nem falamos sobre funções e eu acho que escrevi uma em cada artigo, hahahahah. Mas só pra você associar o aprendizado desse artigo:

<?php // index.php

echo $_GET['a'] + $_GET['b'];

O script acima precisa de um webserver para funcionar. Você pode criar o arquivo numa pasta, abrir ela no terminal e iniciar o servidor do PHP pelo comando php -S localhost:888, assim você vai poder abrir no link http://localhost:888/?a=123&b=321.

Bem, para o script funcionar, é necessário informar dois parâmetros GET: a e b. Ele sempre irá imprimir o resultado da soma se os valores forem numéricos... Mas isso está certo mesmo?

O que acontece se você não informar a e/ou b? E se você quiser que a instrução só seja executada se os dois parâmetros estiverem preenchidos? Nesse caso, você quer controlar a instrução, montando uma estrutura que só permita a entrada de acordo com os critérios, que são:

  • $_GET['a'] existir e ser numérico;
  • $_GET['b'] existir e ser numérico.
<?php // index.php

if (isset($_GET['a']) && is_numeric($_GET['a'])) {
    if (isset($_GET['b']) && is_numeric($_GET['b'])) {
        echo $_GET['a'] + $_GET['b'];
    }
}

Kiko, que código feio...

É, eu sei, eu falhei com a sociedade agora....... Mas foi de propósito. Se você leu esse código e não achou nada horrível, segue aqui uma dica importantíssima pra sua vida: se sua estrutura de controle tem como finalidade controlar apenas um bloco de instrução, você só precisa de uma estrutura.

A lição real é que não é certo ter um número de estruturas de controle maior do que blocos de instrução. No exemplo acima, eu escrevi dois ifs para uma linha de código. Poderia ser um único if:

<?php // index.php

if (isset($_GET['a'], $_GET['b']) && is_numeric($_GET['a']) && is_numeric($_GET['b'])) {
    echo $_GET['a'] + $_GET['b'];
}

Dá para incluir mais de uma verificação em uma única chamada da função isset(), Kiko?

Sim, dá! É sempre bom dar uma olhada na documentação das funções para descobrir esses detalhes, às vezes passa despercebido pela grande maioria dos desenvolvedores.

Outro ponto que podemos melhorar nesse código: não é legal ficar escrevendo $_GET toda hora, se já constatamos que o valor lá dentro existe, podemos armazená-lo em uma variável.

Além disso, a validação do if agora está muito extensa e não deixa muito claro para quem não participou do desenvolvimento o que está sendo analisado: poderia ser uma função ou ser reduzida. Escolhi reduzir, resolvendo o primeiro ponto também:

<?php

$valorEmBranco = null;
$a = $_GET['a'] ?? $valorEmBranco;
$b = $_GET['b'] ?? $valorEmBranco;
if (is_numeric($a) && is_numeric($b)) {
    echo $a + $b;
}

Com isso, fica claro que estamos verificando se os valores são numéricos antes de imprimir uma soma.

E por hoje é só! Não vou mostrar mais estruturas de controle. Ainda dava para explorar um else ali para imprimir um erro quando as condições não são atendidas, mas chega, rs.

Curtiu? Comenta e compartilha! Espero mesmo que vocês dêem um pulo lá pelo Twitter, pois a comunidade dev está cada vez mais presente por lá. Acho isso muito massa. E qualquer coisa, é só perguntar aí nos comentários. Beleza?!

Inté!