Pular para o conteúdo
murad.guide

PHP

Capítulo 5

Decisões com if e else

4 min de leitura 805 palavras 1 gravura

Neste capítulo você vai mostrar uma resposta diferente conforme uma condição.

Seu ponto de partida

Estude depois do capítulo 04. O exemplo deste capítulo é 05-decisoes-if, no pacote que acompanha o volume. Copie a pasta inicio para um diretório de prática e preserve o original. A raiz do exemplo é a referência concluída desta etapa. Sua cópia permite experimentar sem perder a referência.

Execute o PHP na raiz da sua cópia com php -S 127.0.0.1:8000 -t public. Abra http://127.0.0.1:8000/. Não abra PHP por duplo clique nem use o servidor de Python. Encerre com Ctrl+C antes de trocar de etapa.

Como praticar

Leia a explicação e digite ou confira o código indicado. Mude uma coisa. Antes de conferir, anote sua previsão. Salve, recarregue e compare. Se não acontecer o esperado, investigue o erro antes de avançar. Cada experiência parte dos valores da referência. Depois de conferir, desfaça somente a mudança desse experimento antes de começar a próxima lição. Você pode parar depois de uma lição e retomar mais tarde.

Uma condição escolhe um caminho

If significa se. O bloco entre chaves executa quando a condição é verdadeira. Else apresenta o caminho alternativo. Escreva primeiro uma condição fácil de explicar em português: se restantes for maior que zero, mostre Há vagas.

Não confunda decisão do PHP com esconder conteúdo por CSS. O PHP escolhe o texto antes de responder ao navegador. A referência mantém um parágrafo claro em qualquer caminho.

Faça no seu exemplo

Em public/index.php, localize o bloco indicado. A referência completa acompanha esta etapa.

$restantes = 2;
if ($restantes > 0) {
    $status = "Há vagas.";
} else {
    $status = "Oficina completa.";
}

Mude uma coisa e preveja

Troque apenas restantes de 2 para 0.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

O texto passa para Oficina completa.

Se não acontecer

Se nada aparecer, confira se status foi definido nos dois caminhos e se o parágrafo mostra status.

Junte condições com cuidado

Duas condições podem ser necessárias ao mesmo tempo. && significa e: ambas precisam ser verdadeiras. || significa ou: basta uma verdadeira. O exemplo libera um aviso quando há vagas e a oficina está aberta.

Use booleanos sem aspas. Escreva a regra em uma frase antes de digitar; isso reduz trocas entre e e ou. Não acrescente três regras diferentes nesta primeira experiência.

Faça no seu exemplo

Em public/index.php, localize o bloco indicado. A referência completa acompanha esta etapa.

$aberta = true;
if ($restantes > 0 && $aberta) {
    $orientacao = "Escolha sua sessão fictícia.";
} else {
    $orientacao = "Aguarde uma nova sessão.";
}

Mude uma coisa e preveja

Restaure restantes para 2 e depois troque somente aberta para false.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

Há vagas permanece, mas a orientação manda aguardar porque a oficina está fechada.

Se não acontecer

Se a orientação liberar mesmo fechada, confira &&. Usar || daria outra regra.

Cubra os casos de fronteira

Uma fronteira é o valor em que o caminho muda. Aqui é zero. Testar somente o caso feliz não confere a regra completa. Experimente positivo, zero e negativo, um de cada vez.

Um valor negativo não deveria nascer numa contagem real. Nesta demonstração ele permite verificar que a condição > 0 recusa valores que não representam disponibilidade. Validação será estudada antes de guardar qualquer visita.

Faça no seu exemplo

Em public/index.php, localize o bloco indicado. A referência completa acompanha esta etapa.

if ($restantes > 0) {
    $status = "Há vagas.";
} else {
    $status = "Oficina completa.";
}

Mude uma coisa e preveja

Troque somente restantes para -1.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

A condição é falsa; o texto informa Oficina completa. Restaure 2.

Se não acontecer

Se usou >= 0, o caso zero será aceito. Releia a frase da regra e confira o operador.

Trecho do resultado de referência do capítulo 05

A captura mostra um trecho da referência concluída. Abra e percorra o exemplo para conferir o restante. Experimentos temporários podem produzir outra aparência; restaure os valores indicados antes de comparar.

Atividades para fazer antes das respostas

Use uma nova cópia do exemplo. Tente aplicar o que aprendeu antes de consultar os comentários.

  1. Teste restantes igual a 1, 0 e -1.

  2. Explique por que vagas e aberta são condições distintas.

  3. Troque > por >= e compare o caso zero.

Respostas comentadas

Compare sua explicação e o que realmente aconteceu. Outra solução pode funcionar se cumprir o objetivo e preservar o acesso ao conteúdo.

  1. Somente 1 segue o caminho Há vagas.

  2. Uma oficina pode ter espaço e ainda estar fechada. A regra usa ambas.

  3. Com >=, zero entra no caminho positivo e viola a regra desejada.

Quando seguir

Você prevê cada caminho antes de recarregar. Se ainda precisa de ajuda, repita a experiência pequena antes de avançar.

O arquivo completo

Referência do exemplo 05-decisoes-if, reproduzida aqui para que você possa conferir sem sair da página.

public/index.php

<?php
declare(strict_types=1);
$restantes = 2;
$aberta = true;
if ($restantes > 0) { $status = "Há vagas."; } else { $status = "Oficina completa."; }
if ($restantes > 0 && $aberta) { $orientacao = "Escolha sua sessão fictícia."; } else { $orientacao = "Aguarde uma nova sessão."; }
?>
<!doctype html>
<html lang="pt-BR">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>Livro de visitas de prática</title><link rel="stylesheet" href="estilos.css"></head>
<body><a class="pular" href="#conteudo">Pular para o conteúdo</a>
<header><p>Prática de PHP em pequenos passos</p><h1>Livro de visitas</h1>
<p>Conteúdo fictício. Somente neste computador.</p></header>
<main id="conteudo" tabindex="-1">
<h2>Uma resposta conforme os dados</h2><p><?= $status ?></p><p><?= $orientacao ?></p>
</main><footer><p>Servidor de estudo em 127.0.0.1. Encerre com Ctrl+C.</p></footer></body></html>

public/estilos.css

* { box-sizing: border-box; }
body { margin: 0; background: #f4f7fb; color: #203246;
  font: 1.05rem/1.65 Arial, sans-serif; }
header, main, footer { max-width: 48rem; margin-inline: auto; padding: 1.5rem; }
header { padding-top: 2.5rem; }
h1 { font-size: clamp(1.8rem, 5vw, 2.7rem); line-height: 1.2; }
main { background: #fff; border-radius: .8rem; }
article { border-top: 1px solid #cad4df; padding-block: 1rem; }
a { color: #124e77; text-underline-offset: .2em; }
nav { display: flex; flex-wrap: wrap; gap: 1rem; }
label { display: block; font-weight: bold; }
input:not([type=hidden]), textarea { width: 100%; max-width: 34rem;
  border: 2px solid #718095; border-radius: .35rem; padding: .7rem;
  font: inherit; color: inherit; background: #fff; }
button { font: inherit; background: #124e77; color: white;
  border: 0; border-radius: .35rem; padding: .75rem 1.2rem; cursor: pointer; }
button:hover { background: #103b59; }
.mensagem { white-space: pre-wrap; overflow-wrap: anywhere; }
.erros { color: #8b142c; }
.ok { color: #175c30; font-weight: bold; }
:focus-visible { outline: 3px solid #b04d00; outline-offset: 3px; }
.pular { position: absolute; left: -10000px; }
.pular:focus { position: static; display: block; padding: 1rem; background: white; }
@media (max-width: 35rem) { header,main,footer { padding: 1rem; } }