Parte 02

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.

01

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.

funcoes.php
<?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!
02

Strings

As funções de texto mais usadas no dia a dia. Lembre que o índice começa em 0.

strings.php
<?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):

explode-sprintf.php
<?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.

interpolacao.php
<?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)
03

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.

datas.php
<?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
📌 Máscaras comuns: d dia, m mês, Y ano (4 díg.), H hora 24h, i minuto, s segundo, D dia da semana abreviado.
04

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.

index.php
<?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> -->
05

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 { }.

template.php
<?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> -->
06

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.html
<form method="post" action="processa.php">
    <input type="text" name="nome">
    <button type="submit">Enviar</button>
</form>
processa.php
<?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");
}
⚠️ Segurança: nunca imprima dado vindo do usuário direto no HTML. Sempre passe por htmlspecialchars() — senão alguém digita <script> no campo e roda código no navegador de quem visita.
07

Superglobais

Arrays especiais disponíveis em qualquer escopo, sem precisar de global. Guardam dados da requisição, do servidor e da sessão.

SuperglobalO que guarda
$_GETParâmetros da URL (?q=...)
$_POSTCampos enviados por formulário POST
$_REQUESTMistura GET + POST + COOKIE (evite; prefira o específico)
$_SESSIONDados persistidos entre páginas do mesmo usuário
$_SERVERInfo do servidor/requisição (método, caminho, IP…)
superglobais.php
<?php
echo $_SERVER["REQUEST_METHOD"];  // GET ou POST
echo $_GET["q"] ?? "";          // parâmetro ?q=... da URL
echo $_POST["email"] ?? "";     // campo enviado por POST
08

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.

GETPOST
Onde vão os dadosNa URL (?nome=ana)No corpo da requisição
Visível / favoritávelSimNão
Limite de tamanhoCurto (URL)Grande
Usar paraBuscas, filtros, linksCadastro, login, alterações
09

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.

sessao.php
<?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)
⚠️ Armadilha: se aparecer "headers already sent", é porque algo foi impresso (até um espaço antes do <?php) antes do session_start(). Ele precisa vir antes de qualquer saída.
10

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.

classe.php
<?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
11

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.

blog.php
<?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>
← Parte 1 · Fundamentos Parte 3 · Banco de dados →