PHP web
O PHP no seu habitat: funções, manipulação de texto e datas, mistura com HTML, formulários, sessões e noções de orientação a objetos — terminando num mini-blog funcional.
Funções
No PHP 8 você pode (e deve) declarar o tipo dos parâmetros e do retorno. Parâmetros podem ter valor padrão — os opcionais ficam por último.
<?php
// type hints nos parâmetros e no retorno (: tipo)
function saudacao(string $nome, string $saudacao = "Olá"): string {
return "$saudacao, $nome!";
}
echo saudacao("Ana"); // Olá, Ana!
echo saudacao("Bia", "Bom dia"); // Bom dia, Bia!
Strings
As funções de texto mais usadas no dia a dia. Lembre que o índice começa em 0.
<?php
echo strlen("PHP"); // 3
echo strtoupper("php"); // PHP
echo strtolower("PHP"); // php
echo substr("programar", 0, 4); // prog (início, tamanho)
echo str_replace("legal", "ótimo", "PHP é legal"); // PHP é ótimo
echo trim(" oi "); // oi (remove espaços das pontas)
Dividir e juntar texto com explode/implode, e formatar com sprintf (útil para dinheiro):
<?php
$csv = "maçã,banana,uva";
$frutas = explode(",", $csv); // ["maçã", "banana", "uva"]
echo $frutas[1]; // banana
echo implode(" - ", $frutas); // maçã - banana - uva
// sprintf: %.2f = float com 2 casas; %s = string
echo sprintf("R$ %.2f", 19.5); // R$ 19.50
Interpolação: variáveis são lidas dentro de aspas duplas — nunca nas simples.
<?php
$nome = "Ana";
echo "Olá, $nome"; // Olá, Ana (aspas duplas interpolam)
echo 'Olá, $nome'; // Olá, $nome (aspas simples NÃO interpolam)
echo "{$nome}_perfil"; // Ana_perfil ({} isola a variável do texto)
Datas
date() formata data/hora conforme uma "máscara" de letras; time() dá o timestamp Unix (segundos desde 1970). Para algo mais flexível, use a classe DateTime.
<?php
echo date("d/m/Y"); // ex.: 01/06/2026 (dia/mês/ano)
echo date("H:i"); // ex.: 14:30 (hora:minuto, 24h)
echo time(); // ex.: 1748793600 (timestamp em segundos)
// DateTime: orientado a objeto
$dt = new DateTime("2026-06-01 09:00");
echo $dt->format("d/m/Y H:i"); // 01/06/2026 09:00
d dia, m mês, Y ano (4 díg.), H hora 24h, i minuto, s segundo, D dia da semana abreviado.
Include / require
Servem para reaproveitar arquivos (config, cabeçalho, menu). A diferença é o que acontece se o arquivo faltar: include dá só um aviso e segue; require dá erro fatal e para. require_once garante que o arquivo seja carregado uma única vez.
<?php
// config.php contém: $site = "Meu Site";
require_once "config.php"; // fatal se faltar; carrega só uma vez
include "menu.php"; // só um aviso se faltar; segue o script
?>
<h1><?= $site ?></h1> <!-- <?= é atalho de <?php echo -->
<!-- Saída: <h1>Meu Site</h1> -->
Misturar PHP e HTML
Em arquivos de template, é comum abrir e fechar <?php ?> no meio do HTML. A sintaxe alternativa (if: … endif;) deixa isso mais legível do que chaves { }.
<?php $logado = true; ?>
<?php if ($logado): ?>
<p>Bem-vindo de volta!</p>
<?php else: ?>
<p>Faça login.</p>
<?php endif; ?>
<ul>
<?php foreach (["A", "B", "C"] as $item): ?>
<li><?= $item ?></li>
<?php endforeach; ?>
</ul>
<!-- Saída: parágrafo "Bem-vindo" + lista <li>A</li><li>B</li><li>C</li> -->
Formulários
O HTML envia os campos; o PHP lê em $_POST (ou $_GET). Duas regras de ouro: valide no backend (o frontend é só UX) e escape a saída com htmlspecialchars() para evitar XSS.
<form method="post" action="processa.php">
<input type="text" name="nome">
<button type="submit">Enviar</button>
</form>
<?php
// ?? "" evita aviso se o campo não veio. trim tira espaços.
$nome = trim($_POST["nome"] ?? "");
// Validação obrigatória no backend.
if ($nome === "") {
echo "Nome é obrigatório.";
} else {
// htmlspecialchars escapa < > & " — impede injeção de HTML/JS (XSS).
echo "Olá, " . htmlspecialchars($nome, ENT_QUOTES, "UTF-8");
}
htmlspecialchars() — senão alguém digita <script> no campo e roda código no navegador de quem visita.
Superglobais
Arrays especiais disponíveis em qualquer escopo, sem precisar de global. Guardam dados da requisição, do servidor e da sessão.
| Superglobal | O que guarda |
|---|---|
$_GET | Parâmetros da URL (?q=...) |
$_POST | Campos enviados por formulário POST |
$_REQUEST | Mistura GET + POST + COOKIE (evite; prefira o específico) |
$_SESSION | Dados persistidos entre páginas do mesmo usuário |
$_SERVER | Info do servidor/requisição (método, caminho, IP…) |
<?php
echo $_SERVER["REQUEST_METHOD"]; // GET ou POST
echo $_GET["q"] ?? ""; // parâmetro ?q=... da URL
echo $_POST["email"] ?? ""; // campo enviado por POST
GET vs POST
Os dois métodos HTTP mais usados em formulários. A regra prática: GET para buscar/filtrar (sem alterar nada); POST para criar, alterar ou enviar dados sensíveis.
| GET | POST | |
|---|---|---|
| Onde vão os dados | Na URL (?nome=ana) | No corpo da requisição |
| Visível / favoritável | Sim | Não |
| Limite de tamanho | Curto (URL) | Grande |
| Usar para | Buscas, filtros, links | Cadastro, login, alterações |
Sessões
A sessão guarda dados do usuário entre páginas (login, carrinho…). Chame session_start() no topo, antes de qualquer saída. Depois é só ler/gravar em $_SESSION.
<?php
session_start(); // SEMPRE no topo, antes de qualquer echo
$_SESSION["carrinho"][] = "Livro"; // grava na sessão
$_SESSION["carrinho"][] = "Caneta";
print_r($_SESSION["carrinho"]); // Array ( [0] => Livro [1] => Caneta )
session_destroy(); // encerra a sessão (ex.: logout)
<?php) antes do session_start(). Ele precisa vir antes de qualquer saída.
Orientação a objetos (noções)
Uma class agrupa dados (propriedades) e comportamento (métodos). O __construct roda ao criar o objeto com new. Dentro da classe, $this é o objeto atual. A visibilidade (public/private) controla o acesso de fora.
<?php
class Carro {
public string $modelo; // propriedade pública
private int $velocidade = 0; // privada: só acessível dentro da classe
// Construtor: roda automaticamente no new.
public function __construct(string $modelo) {
$this->modelo = $modelo; // $this = o objeto atual
}
public function acelerar(int $delta): void {
$this->velocidade += $delta;
}
public function status(): string {
return "$this->modelo a $this->velocidade km/h";
}
}
$c = new Carro("Fusca"); // instancia o objeto
$c->acelerar(30);
echo $c->status(); // Fusca a 30 km/h
Mini-projeto: blog
Juntando tudo: um blog simples que guarda os posts na sessão. O formulário adiciona posts; a página lista todos. Note o POST-Redirect-GET (redireciona após salvar, evitando reenvio ao atualizar a página) e o helper h() escapando toda saída.
<?php
session_start();
// Helper de escape — evita repetir htmlspecialchars em toda saída.
function h(string $s): string {
return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}
// Posts iniciais, só na primeira visita.
if (!isset($_SESSION["posts"])) {
$_SESSION["posts"] = [
["titulo" => "Primeiro post", "corpo" => "Olá, mundo do PHP!"],
];
}
// Se veio POST, valida e adiciona o novo post.
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$titulo = trim($_POST["titulo"] ?? "");
$corpo = trim($_POST["corpo"] ?? "");
if ($titulo !== "" && $corpo !== "") {
$_SESSION["posts"][] = ["titulo" => $titulo, "corpo" => $corpo];
}
// POST-Redirect-GET: redireciona para não reenviar ao dar F5.
header("Location: blog.php");
exit;
}
?>
<!DOCTYPE html>
<html lang="pt-BR">
<body>
<h1>Mini Blog</h1>
<form method="post">
<input type="text" name="titulo" placeholder="Título">
<textarea name="corpo" placeholder="Conteúdo"></textarea>
<button type="submit">Publicar</button>
</form>
<?php foreach ($_SESSION["posts"] as $post): ?>
<article>
<h2><?= h($post["titulo"]) ?></h2>
<p><?= h($post["corpo"]) ?></p>
</article>
<?php endforeach; ?>
</body>
</html>