Capítulo 3
Tipos de dados sem adivinhação
5 min de leitura 900 palavras 1 gravura
Neste capítulo você vai distinguir texto, número, verdadeiro ou falso e ausência de valor.
Seu ponto de partida
Estude depois do capítulo 02. O exemplo deste capítulo é 03-tipos-dados, 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.
Um valor tem um tipo
Um texto é uma sequência de caracteres, chamada string. Um número inteiro não tem parte fracionária. Um número com parte fracionária é chamado float. As aspas fazem diferença: “12” é texto; 12 é inteiro. No início do exemplo, cada variável recebe um valor escrito por você. Ainda não há dados externos.
O nome da variável explica seu papel. Evite nomes como x quando vagas explica melhor o que está guardado. O PHP pode converter tipos em certas operações. Primeiro vamos reconhecer os valores; depois faremos operações explícitas.
Faça no seu exemplo
Em public/index.php, localize o bloco indicado. A referência completa acompanha esta etapa.
$vagas = 12;
$valor = 29.5;
$rotulo = "12 vagas";
Mude uma coisa e preveja
Troque somente 12 por 8 em vagas.
Anote o que você acha que vai acontecer antes de salvar e recarregar.
Recarregue e confira
O parágrafo de vagas mostra 8; o rótulo continua com o texto anterior, pois é outra variável.
Se não acontecer
Se o rótulo mudar sozinho, confira se editou mais de uma linha. Texto escrito separadamente não se atualiza por associação de palavras.
Verdadeiro, falso e nenhum valor
Um booleano guarda true ou false, sem aspas. Ele representa uma decisão, como inscrições abertas. Não use “false” para representar falso: isso é um texto não vazio. Null indica ausência de valor. Ausência não é a mesma coisa que zero ou texto vazio.
Echo de um booleano pode ser pouco claro: false não produz uma palavra visível. A referência transforma a decisão em Aberta ou Encerrada antes de mostrar. Você aprenderá as decisões com if numa etapa própria. Aqui observe somente que o tipo serve ao significado do dado.
Faça no seu exemplo
Em public/index.php, localize o bloco indicado. A referência completa acompanha esta etapa.
$aberta = true;
$observacao = null;
Mude uma coisa e preveja
Troque somente true por false.
Anote o que você acha que vai acontecer antes de salvar e recarregar.
Recarregue e confira
O status muda para Encerrada. A observação segue sem valor.
Se não acontecer
Não coloque aspas em false. “false” é texto e não representa a decisão que esta prática espera.
Veja o tipo para investigar
Get_debug_type informa o tipo sem mostrar o conteúdo de uma variável. Var_dump mostra tipo e valor e é útil num teste pequeno. Saídas de investigação não pertencem a uma página de entrega. Nunca use essas ferramentas para despejar senhas, sessões ou dados pessoais.
O exemplo apresenta os nomes dos tipos num bloco de diagnóstico fictício. Compare o valor no editor com o tipo informado. Isso ajuda a investigar diferenças entre um número e um texto que parece número.
Faça no seu exemplo
Em public/index.php, localize o bloco indicado. A referência completa acompanha esta etapa.
echo get_debug_type($vagas);
Mude uma coisa e preveja
Troque somente $vagas = 12 por $vagas = “12”.
Anote o que você acha que vai acontecer antes de salvar e recarregar.
Recarregue e confira
O conteúdo parece igual no parágrafo, mas o diagnóstico passa de int para string. Restaure a referência.
Se não acontecer
Se continuar int, confira as aspas e a cópia em execução. A aparência do texto no navegador não é suficiente para reconhecer o tipo.

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.
-
Transforme valor num inteiro sem alterar vagas.
-
Compare false com “false” no editor e explique os tipos.
-
Explique a diferença entre null e 0.
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.
-
Use $valor = 29; sem parte decimal. O tipo passa a int.
-
False é uma decisão booleana. “false” é uma sequência de letras.
-
Null marca ausência; 0 é um número existente.
Quando seguir
Você reconhece os tipos usados e confere o tipo de um valor. Se ainda precisa de ajuda, repita a experiência pequena antes de avançar.
O arquivo completo
Referência do exemplo 03-tipos-dados, reproduzida aqui para que você possa conferir sem sair da página.
public/index.php
<?php
declare(strict_types=1);
$vagas = 12;
$valor = 29.5;
$rotulo = "12 vagas";
$aberta = true;
$observacao = null;
?>
<!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>Dados da oficina fictícia</h2><p>Vagas: <?= $vagas ?></p><p>Valor demonstrativo: <?= $valor ?></p><p><?= $rotulo ?></p><p>Status: <?= $aberta ? "Aberta" : "Encerrada" ?></p><p>Tipo de vagas: <?= get_debug_type($vagas) ?></p><p>Tipo de observação: <?= get_debug_type($observacao) ?></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; } }