Introdução ao PHP
A linguagem que roda no servidor e dá vida ao back-end da web. Sim, o elefante é a mascote.
🐘 O que é PHP e sua história
PHP significa PHP: Hypertext Preprocessor. Sim, o nome é uma sigla… que contém a própria sigla dentro dela. Isso se chama acrônimo recursivo, e sim, é exatamente tão hilário quanto parece. A comunidade PHP tem senso de humor assim.
PHP é como aquele amigo que todo mundo fala mal mas ainda chama na hora de construir uma casa. Todo desenvolvedor já ouviu "PHP é coisa do passado" — e todo desenvolvedor já abriu um WordPress, um Laravel ou um e-commerce rodando PHP no servidor de produção.
Como tudo começou
Em 1994, um cara chamado Rasmus Lerdorf estava cansado de escrever scripts CGI em C para rastrear quem visitava o seu currículo online. Então ele criou um conjunto de ferramentas simples chamado "Personal Home Page tools" — apelidado de PHP/FI. A ideia era pequena, pragmática e, bem… não tinha pretensão nenhuma de virar uma das linguagens mais usadas do mundo.
?? (null coalescing). O elefante acelerou.Quem usa PHP hoje?
Segundo as estatísticas mais recentes, cerca de 77% de todos os sites da web com back-end identificado usam PHP. Isso inclui gigantes como:
- WordPress — mais de 40% de todos os sites do mundo rodam nele
- Wikipedia — sim, a enciclopédia da humanidade
- Facebook — usou PHP por anos e criou o Hack (dialeto próprio de PHP)
- Laravel, Symfony, CodeIgniter — frameworks modernos e robustos
- Drupal, Joomla, Magento — CMSs e e-commerces
Onde PHP se encaixa no fluxo da web
PHP vive no servidor. Quando alguém acessa um site, o PHP processa a lógica, consulta o banco de dados e monta o HTML que o browser vai exibir.
Ponto chave: o browser nunca vê o código PHP. Ele recebe apenas o HTML gerado. PHP fica 100% no servidor — por isso é chamado de linguagem server-side.
🌐 Como PHP se relaciona com a Web
JavaScript roda no browser. PHP roda no servidor. Essa é a diferença mais importante. Quando você abre uma página PHP, o servidor executa todo o código e te manda de volta um HTML prontinho — como um restaurante que prepara o prato na cozinha e entrega pronto na mesa.
HTML estático vs página PHP dinâmica
📄 HTML Estático
Arquivo .html — sempre o mesmo conteúdo. Todo mundo que abre vê a mesma coisa.
<p>Olá, visitante!</p>
<p>Hoje é... sei lá qual dia.</p>
🐘 Página PHP Dinâmica
Arquivo .php — conteúdo muda conforme lógica, dados do banco, hora do dia, usuário logado etc.
<p>Olá, <?= $nomeUsuario ?>!</p>
<p>Hoje é <?= date('d/m/Y') ?>.</p>
A stack LAMP
Historicamente, o ambiente mais clássico para rodar PHP é chamado de LAMP:
Ambiente local: Para rodar PHP na sua máquina sem configurar nada complexo, use XAMPP (Windows/Mac/Linux) ou Laragon (Windows). Eles instalam Apache + PHP + MySQL de uma vez com alguns cliques.
Tags PHP e como misturar com HTML
O PHP usa a tag <?php para abrir e ?> para fechar. Você pode misturar código PHP com HTML normalmente — o servidor processa as partes PHP e deixa o HTML passar intacto.
<!DOCTYPE html>
<html>
<body>
<!-- PHP misturado com HTML -->
<?php
$nome = "Maria";
$hora = date("H");
if ($hora < 12) {
$saudacao = "Bom dia";
} elseif ($hora < 18) {
$saudacao = "Boa tarde";
} else {
$saudacao = "Boa noite";
}
?>
<h1><?= $saudacao ?>, <?= $nome ?>!</h1>
<p>São <?= date("H:i") ?> horas.</p>
</body>
</html>
A tag curta <?= é atalho para <?php echo — perfeita para exibir valores dentro do HTML sem escrever muito.
✏️ Sintaxe básica
PHP tem uma sintaxe bem acessível para quem já viu um pouco de programação. Mas tem algumas regras que você vai esquecer no começo e levar sustos — então vamos cobrir todas elas.
Tags e comentários
<?php
// Comentário de uma linha
# Também comentário de uma linha (estilo shell)
/*
Comentário
de múltiplas linhas
*/
// Tag curta de saída — atalho para echo
?>
<p>Olá, <?= "mundo" ?>!</p>
Variáveis — sempre com $
Todo nome de variável em PHP começa com o sinal de dólar $. Sem o $, não é variável. Simples assim — e impossível de esquecer depois do terceiro erro de sintaxe.
<?php
// Variáveis: sempre começam com $
$nome = "João"; // string
$idade = 28; // integer
$altura = 1.75; // float
$ativo = true; // boolean
$nada = null; // null
// Convenções de nomenclatura
$nomeCompleto = "camelCase"; // mais comum em variáveis
$nome_completo = "snake_case"; // também aceito
// Exibir com echo
echo $nome; // João
echo "Olá, " . $nome; // ponto (.) concatena strings
// Erro comum: esquecer o $
// echo nome; ← ERRO! PHP vai procurar uma constante chamada 'nome'
Ponto e vírgula é obrigatório! Cada instrução em PHP termina com ;. Esquecer o ponto e vírgula é um dos erros mais clássicos de iniciante. O PHP não vai adivinhar onde a linha termina.
echo vs print
<?php
// echo: aceita múltiplos valores, levemente mais rápido
echo "Olá";
echo "Olá", " mundo"; // múltiplos argumentos separados por vírgula
// print: retorna 1 (pode ser usado em expressões), só aceita um valor
print "Olá mundo";
// Concatenação com ponto (.)
$cidade = "São Paulo";
echo "Bem-vindo a " . $cidade . "!";
// Na prática: echo é o mais usado no dia a dia
Case sensitivity — onde importa e onde não importa
<?php
// Variáveis são case-sensitive — CUIDADO!
$nome = "Ana";
// echo $Nome; ← ERRO! $Nome e $nome são variáveis diferentes
// Funções NÃO são case-sensitive — tanto faz
echo("oi");
ECHO("oi"); // funciona igual
strlen("oi");
STRLEN("oi"); // também funciona
📦 Tipos de Dados
PHP é uma linguagem de tipagem dinâmica — você não precisa declarar o tipo da variável, o PHP descobre sozinho. Isso é ótimo para agilidade e pode ser uma fonte de surpresas se você não prestar atenção.
Os tipos principais
| Tipo | Exemplo | Descrição |
|---|---|---|
string | "olá", 'mundo' | Texto |
integer | 42, -7 | Número inteiro |
float | 3.14, -0.5 | Número decimal |
boolean | true, false | Verdadeiro ou falso |
null | null | Ausência de valor |
array | [1, 2, 3] | Coleção de valores |
object | new Classe() | Instância de classe |
var_dump() e gettype() para debugar
<?php
$preco = 29.90;
$ativo = true;
$nome = "Produto X";
// var_dump: mostra tipo + valor (essencial para debug)
var_dump($preco); // float(29.9)
var_dump($ativo); // bool(true)
var_dump($nome); // string(9) "Produto X"
// gettype: retorna o nome do tipo como string
echo gettype($preco); // double (PHP usa 'double' pra float)
echo gettype($nome); // string
Aspas simples vs aspas duplas
Uma das diferenças mais importantes para iniciantes PHP:
<?php
$nome = "João";
// Aspas DUPLAS: interpolação de variáveis! PHP substitui a variável.
echo "Olá, $nome!"; // Olá, João!
echo "Olá, {$nome}!"; // Olá, João! (chaves deixam mais claro)
// Aspas SIMPLES: texto literal. PHP não interpola nada.
echo 'Olá, $nome!'; // Olá, $nome! (literal)
// Regra prática: use duplas quando precisar de variáveis,
// simples quando for texto puro (levemente mais rápido)
Heredoc e Nowdoc
<?php
$usuario = "Maria";
// Heredoc: como aspas duplas, mas para textos longos
$html = <<<EOT
<div>
<h1>Bem-vinda, $usuario!</h1>
<p>Interpolação funciona aqui.</p>
</div>
EOT;
// Nowdoc: como aspas simples, sem interpolação
$codigo = <<<'EOT'
echo $variavel; // isso não é interpolado
EOT;
Type casting — convertendo tipos
<?php
$valor = "42"; // string
$inteiro = (int) $valor; // 42 (integer)
$flutuante = (float) $valor; // 42.0 (float)
$texto = (string) 99; // "99" (string)
$bool = (bool) 0; // false
$bool2 = (bool) 1; // true
// intval(), floatval(), strval() são alternativas funcionais
$n = intval("10px"); // 10 — extrai o número do início da string
Funções de string essenciais
🔀 Condicionais e Loops
Condicionais decidem o que acontece. Loops repetem o que precisa ser repetido. Juntos, eles são o coração de qualquer lógica de programação.
if / elseif / else
<?php
$logado = true;
$perfil = "admin";
if ($logado && $perfil === "admin") {
echo "Bem-vindo, administrador!";
} elseif ($logado) {
echo "Bem-vindo, usuário!";
} else {
echo "Por favor, faça login.";
}
// Operador ternário: condição ? valor_se_true : valor_se_false
$msg = $logado ? "Olá!" : "Faça login";
// Null coalescing (PHP 7+): retorna o primeiro valor não-null
$nome = $_GET['nome'] ?? "visitante";
switch
<?php
$diaSemana = 3;
switch ($diaSemana) {
case 1:
echo "Segunda-feira";
break;
case 2:
echo "Terça-feira";
break;
case 3:
echo "Quarta-feira";
break;
default:
echo "Outro dia";
}
match — o switch moderno (PHP 8)
<?php
$status = "aprovado";
// match usa comparação estrita (===), não precisa de break,
// e retorna um valor diretamente — muito mais limpo que switch
$msg = match($status) {
"aprovado" => "✅ Pedido aprovado!",
"pendente" => "⏳ Aguardando aprovação...",
"recusado" => "❌ Pedido recusado.",
default => "Status desconhecido",
};
echo $msg; // ✅ Pedido aprovado!
Loops
<?php
// for: quando você sabe quantas vezes vai repetir
for ($i = 0; $i < 5; $i++) {
echo "Iteração: $i<br>";
}
// while: enquanto a condição for verdadeira
$contador = 0;
while ($contador < 3) {
echo "Contando: $contador<br>";
$contador++;
}
// do...while: executa pelo menos uma vez antes de checar
do {
echo "Pelo menos uma vez!<br>";
$contador++;
} while ($contador < 1);
// foreach: perfeito para percorrer arrays
$produtos = ["Tênis", "Camiseta", "Boné"];
foreach ($produtos as $produto) {
echo "- $produto<br>";
}
// break: interrompe o loop
// continue: pula para a próxima iteração
for ($i = 0; $i < 10; $i++) {
if ($i === 5) break; // para ao chegar em 5
if ($i % 2 === 0) continue; // pula números pares
echo $i; // exibe: 1, 3
}
⚙️ Funções
Funções são blocos de código reutilizáveis. Em vez de escrever a mesma lógica dez vezes, você escreve uma vez, dá um nome, e chama quando precisar. Essa é a base da programação que não te faz querer largar tudo.
Definindo e chamando funções
<?php
// Definição básica
function saudacao($nome) {
return "Olá, $nome!";
}
echo saudacao("Pedro"); // Olá, Pedro!
// Parâmetro com valor padrão
function boasVindas($nome = "visitante") {
return "Bem-vindo, $nome!";
}
echo boasVindas(); // Bem-vindo, visitante!
echo boasVindas("Ana"); // Bem-vindo, Ana!
Type hints — PHP 7+
A partir do PHP 7, você pode (e deve!) declarar os tipos esperados dos parâmetros e do retorno. Isso previne bugs e torna o código muito mais legível.
<?php
// Type hints: tipo do parâmetro : tipo do retorno
function soma(int $a, int $b): int {
return $a + $b;
}
echo soma(3, 4); // 7
// soma("oi", 4); ← TypeError em strict mode
// Nullable type: aceita o tipo ou null
function buscarUsuario(int $id): ?string {
// Retorna nome ou null se não encontrar
return $id === 1 ? "Admin" : null;
}
// Union types (PHP 8): aceita mais de um tipo
function formatar(int|float $valor): string {
return "R$ " . number_format($valor, 2, ',', '.');
}
Escopo de variáveis
<?php
$total = 100; // variável global
function calcularDesconto($pct) {
// $total não existe aqui! Escopo local.
// echo $total; ← undefined variable
// Para acessar a global, use a keyword global:
global $total;
return $total * (1 - $pct / 100);
}
echo calcularDesconto(10); // 90
// Dica: prefira passar como parâmetro em vez de usar global
Funções nativas que você vai usar todo dia
date('d/m/Y')"", 0, [], null, false).is_* para todos os tipos.📚 Arrays
Arrays em PHP são superpoderes. Ao contrário de outras linguagens onde arrays e dicionários são coisas separadas, em PHP tudo é array — indexado por número ou por string. Versátil até demais.
Array indexado
<?php
// Array indexado (índices numéricos, começa em 0)
$frutas = ["maçã", "banana", "laranja"];
echo $frutas[0]; // maçã
echo $frutas[2]; // laranja
// Adicionar elementos
$frutas[] = "uva"; // adiciona no final
array_push($frutas, "manga"); // equivalente
// Remover último elemento
$ultima = array_pop($frutas);
// Contar elementos
echo count($frutas); // 4
Array associativo
<?php
// Array associativo: chaves personalizadas (como objeto/dicionário)
$usuario = [
"nome" => "João",
"idade" => 25,
"email" => "joao@email.com",
"ativo" => true,
];
echo $usuario["nome"]; // João
echo $usuario["idade"]; // 25
// Modificar um valor
$usuario["idade"] = 26;
// foreach com chave => valor
foreach ($usuario as $chave => $valor) {
echo "$chave: $valor<br>";
}
// nome: João
// idade: 26
// email: joao@email.com
// ativo: 1
Array multidimensional
<?php
// Array de arrays — muito comum para representar tabelas/listas
$produtos = [
["nome" => "Tênis", "preco" => 299.90, "estoque" => 15],
["nome" => "Camiseta", "preco" => 79.90, "estoque" => 42],
["nome" => "Boné", "preco" => 49.90, "estoque" => 8],
];
// Acessar elemento específico
echo $produtos[0]["nome"]; // Tênis
echo $produtos[1]["preco"]; // 79.9
// Percorrer e exibir
foreach ($produtos as $p) {
echo "{$p['nome']} — R$ {$p['preco']} ({$p['estoque']} em estoque)<br>";
}
Funções de array mais usadas
<?php
$numeros = [5, 3, 8, 1, 9, 2];
$frutas = ["maçã", "banana"];
$legumes = ["cenoura", "brócolis"];
// Ordenar
sort($numeros); // [1, 2, 3, 5, 8, 9] — ordena in-place
// Ordenação customizada
usort($produtos, function($a, $b) {
return $a["preco"] <=> $b["preco"]; // operador spaceship
});
// Mesclar arrays
$alimentos = array_merge($frutas, $legumes);
// Verificar se valor existe
if (in_array("banana", $frutas)) {
echo "Tem banana!";
}
// Obter só as chaves ou só os valores
$chaves = array_keys($usuario);
$valores = array_values($usuario);
// array_map: transforma cada elemento
$maiusculas = array_map('strtoupper', $frutas);
// ["MAÇÃ", "BANANA"]
// array_filter: filtra elementos (mantém os que passam no callback)
$caros = array_filter($produtos, function($p) {
return $p["preco"] > 100;
});
// Spread operator (PHP 8) — espalhar array em argumentos
$extra = ["uva", "manga"];
$todasFrutas = ["maçã", ...$extra]; // ["maçã", "uva", "manga"]
📬 PHP e Formulários HTML
Uma das coisas mais práticas do PHP é processar formulários HTML. O usuário preenche, clica em enviar, o PHP recebe, valida, e faz o que precisar. É a base de 99% dos sites com interação.
$_GET vs $_POST — quando usar cada um
$_GET
Dados aparecem na URL: pagina.php?nome=João&id=5
- Bom para buscas e filtros
- Pode ser salvo nos favoritos
- Visível na URL — não use para senhas
- Limite de tamanho pela URL (~2KB)
$_POST
Dados enviados no corpo da requisição HTTP — invisíveis na URL.
- Bom para login, cadastro, formulários
- Não aparece na URL
- Mais seguro para dados sensíveis
- Suporta dados maiores e arquivos
Exemplo completo: formulário de contato
O HTML do formulário:
<form action="processar.php" method="post">
<label>Nome:</label>
<input type="text" name="nome" required>
<label>E-mail:</label>
<input type="email" name="email" required>
<label>Mensagem:</label>
<textarea name="mensagem" rows="5"></textarea>
<button type="submit">Enviar</button>
</form>
O PHP que processa (processar.php):
<?php
$erros = [];
// 1. Verificar se o formulário foi enviado via POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 2. Sanitizar: limpar os dados antes de usar
$nome = trim(htmlspecialchars($_POST['nome'] ?? ''));
$email = trim(htmlspecialchars($_POST['email'] ?? '')));
$mensagem = trim(strip_tags($_POST['mensagem'] ?? ''));
// 3. Validar: checar se os dados fazem sentido
if (empty($nome)) {
$erros[] = "Nome é obrigatório.";
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$erros[] = "E-mail inválido.";
}
if (strlen($mensagem) < 10) {
$erros[] = "Mensagem muito curta (mínimo 10 caracteres).";
}
// 4. Processar se não houver erros
if (empty($erros)) {
// Aqui você enviaria e-mail, salvaria no banco etc.
echo "<p>✅ Mensagem recebida! Obrigado, $nome.</p>";
} else {
// Exibir erros
foreach ($erros as $erro) {
echo "<p style='color:red'>❌ $erro</p>";
}
}
}
?>
REGRA DE OURO DA SEGURANÇA: NUNCA confie em dados vindos do usuário sem validar e sanitizar. Um usuário mal-intencionado pode enviar qualquer coisa em um formulário — scripts, SQL malicioso, código HTML. Sempre use htmlspecialchars(), strip_tags(), trim() e filter_var() antes de usar qualquer dado do $_POST ou $_GET.
Funções de validação e sanitização
<?php
$email = "usuario@exemplo.com";
$idade = "25";
$url = "https://exemplo.com";
// filter_var: validação
filter_var($email, FILTER_VALIDATE_EMAIL); // string ou false
filter_var($idade, FILTER_VALIDATE_INT); // int ou false
filter_var($url, FILTER_VALIDATE_URL); // string ou false
// filter_var: sanitização (limpa o valor)
$emailLimpo = filter_var($email, FILTER_SANITIZE_EMAIL);
$numLimpo = filter_var("R$ 29,90", FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
// htmlspecialchars: converte caracteres especiais em entidades HTML
// Evita XSS (Cross-Site Scripting)
$input = '<script>alert("XSS")</script>';
echo htmlspecialchars($input);
// <script>alert("XSS")</script> — inofensivo!
// strip_tags: remove todas as tags HTML do texto
echo strip_tags("<b>Texto</b> normal"); // Texto normal
Superglobais — uma visão geral
?busca=php → $_GET['busca']session_start().setcookie() para criar.type="file"). Contém nome, tipo, tamanho e caminho temporário.$_SESSION — mantendo o usuário logado
<?php
// session_start() DEVE ser a primeira coisa do arquivo
session_start();
// Salvar dados na sessão (após login bem-sucedido)
$_SESSION['usuario_id'] = 42;
$_SESSION['usuario_nome'] = "Maria";
$_SESSION['logado'] = true;
// Verificar se está logado em outra página
if (isset($_SESSION['logado']) && $_SESSION['logado'] === true) {
echo "Bem-vinda, {$_SESSION['usuario_nome']}!";
} else {
// Redirecionar para login
header("Location: login.php");
exit;
}
// Destruir sessão (logout)
session_destroy();
Sessão vs Cookie: A sessão guarda os dados no servidor — o browser só guarda um ID de sessão num cookie pequeno. Cookies ficam no browser do usuário — ótimos para lembrar preferências, mas nunca guarde dados sensíveis neles, pois o usuário pode ver e editar cookies.
🐘 Resumo do módulo PHP
- PHP é uma linguagem server-side: roda no servidor, gera HTML, o browser nunca vê o código
- Arquivos têm extensão
.php, código fica entre<?phpe?>(ou<?=para exibir) - Toda variável começa com
$— e ponto e vírgula é obrigatório no fim de cada instrução - Aspas duplas interpolam variáveis; aspas simples são texto literal
- PHP 7+ trouxe type hints; PHP 8 trouxe JIT,
match, named args e union types - Arrays em PHP são tanto indexados (numérico) quanto associativos (chave => valor)
- Formulários enviam dados via
$_POSTou$_GET— sempre valide e sanitize antes de usar htmlspecialchars(),strip_tags()efilter_var()são seus escudos contra XSS e dados inválidos- Sessões (
$_SESSION) permitem manter estado entre requisições — base do sistema de login - O ecossistema PHP é enorme: WordPress, Laravel, Symfony, Drupal — há framework pra tudo