
Rocketseat

Navegação Rápida:
Uma breve viagem no tempo: a história e evolução do PHP
1Preparando o terreno: configurando seu ambiente de desenvolvimento PHP
2Os alicerces: fundamentos essenciais da linguagem PHP
3Controlando o fluxo e reutilizando código: estruturas de controle e funções
4Organização e escalabilidade: PHP orientado a objetos (OOP)
5Interagindo com o mundo exterior: manipulação de arquivos e banco de dados
6Acelerando o desenvolvimento: frameworks populares de PHP
7Código seguro e profissional: segurança e boas práticas em PHP
8Mãos à obra: ideias de projetos práticos para exercitar
9Indo além: recursos essenciais para aprofundamento
10Conclusão: decole sua carreira com PHP!
11

- Alta demanda no mercado: muitas empresas, de startups a gigantes, usam PHP.
- Curva de aprendizado acessível: é uma ótima porta de entrada para o backend, mesmo que você esteja começando.
- Excelente integração com bancos de dados: trabalhar com MySQL, PostgreSQL e outros é muito direto.
- Comunidade vibrante e ativa: recursos, bibliotecas e ajuda não faltam.

Uma breve viagem no tempo: a história e evolução do PHP
- PHP 3 (1998): trouxe uma sintaxe mais parecida com a que conhecemos hoje e começou a ganhar popularidade.
- PHP 5 (2004): uma revolução! Introduziu um modelo de Orientação a Objetos (OOP) robusto, o PDO (PHP Data Objects) para acesso a bancos de dados e muitas outras melhorias. Foi um salto de maturidade.
- PHP 7 (2015): outro divisor de águas! O foco foi em performance, com a Zend Engine 3, entregando melhorias drásticas de velocidade (até 2x mais rápido que o PHP 5.6) e menor consumo de memória. Trouxe também tipagem escalar e de retorno.
- PHP 8+ (2020 em diante): a modernização continua a todo vapor! O PHP 8 trouxe o compilador JIT (Just-In-Time),
Attributes
,Named Arguments
, a expressãomatch
,Union Types
e muito mais, tornando a linguagem ainda mais expressiva, rápida e segura. O PHP 8.4, a versão mais recente até o momento (abril de 2025), continua refinando a linguagem.

Preparando o terreno: configurando seu ambiente de desenvolvimento PHP
- O Interpretador PHP: o "cérebro" que executa seu código.
- Um servidor web: como Apache ou Nginx, para processar as requisições HTTP e entregar suas páginas.
- Um banco de dados: geralmente MySQL ou PostgreSQL, para armazenar os dados da sua aplicação.
Opção 1: pacotes "tudo-em-um" (ideal para iniciantes)
- Como verificar: após instalar um desses pacotes e iniciar os serviços (Apache e MySQL), crie um arquivo chamado
info.php
na pasta raiz do seu servidor web (geralmentehtdocs
no XAMPP ouwww
no Laragon/MAMP) com o seguinte conteúdo:PHP
<?php phpinfo(); ?>
http://localhost/info.php
. Se você vir uma página cheia de informações sobre a sua instalação do PHP, parabéns, está tudo pronto!Opção 2: Docker (abordagem moderna)
Opção 3: servidor embutido do PHP (para testes rápidos)
php -S localhost:8000
Editor de código:
- PHP Intelephense: autocomplete inteligente, análise de código e muito mais.
- PHP Debug: permite depurar seu código passo a passo diretamente no editor.
- Prettier - Code formatter: para manter seu código formatado e padronizado (funciona bem com plugins PHP).
E agora? Bora decolar com PHP?

Os alicerces: fundamentos essenciais da linguagem PHP
1. Sintaxe básica e tags PHP
<?php
e ?>
.<!DOCTYPE html> <html> <head> <title>Aprendendo PHP na Rocketseat</title> </head> <body> <h1> <?php // Isso é um comentário de linha única /* Isso é um comentário de múltiplas linhas */ echo "Decole com PHP!"; // 'echo' exibe texto na página ?> </h1> <p>Meu primeiro script PHP.</p> <?php print "<p>Print também funciona!</p>"; // 'print' é similar a 'echo' ?> </body> </html>
2. Variáveis
$
) seguido pelo nome.- Nomes de variáveis são case-sensitive (
$nome
é diferente de$Nome
).
- Devem começar com letra ou underscore (
_
), seguido por letras, números ou underscores.
<?php $saudacao = "Olá, Dev!"; // String $ano = 2025; // Integer $versaoPHP = 8.3; // Float (ou Double) $aprendendo = true; // Boolean $modulos = null; // NULL (sem valor) echo $saudacao; // Exibe "Olá, Dev!" echo "<br>"; // Quebra de linha HTML echo "Estamos no ano de $ano"; // Interpolação com aspas duplas echo 'Estamos no ano de ' . $ano; // Concatenação com ponto ?>
3. Tipos de dados
string
: sequência de caracteres ("Olá"
,'Rocketseat'
). Aspas duplas interpretam variáveis internas ("$saudacao"
), aspas simples não.
integer
: números inteiros (10
,5
,2025
).
float
(oudouble
): números com ponto flutuante (3.14
,8.3
).
boolean
: representa valores verdadeiro (true
) ou falso (false
).
array
: coleção ordenada de valores. Pode conter diferentes tipos de dados.
object
: instância de uma classe (veremos mais sobre OOP).
NULL
: representa uma variável sem valor.
var_dump()
é sua melhor amiga:<?php $nome = "Laís"; $idade = 28; $hobbies = ["Programar", "Ler", "Café"]; $empresa = null; var_dump($nome); // string(4) "Laís" echo "<br>"; var_dump($idade); // int(28) echo "<br>"; var_dump($hobbies); // array(3) { [0]=> string(9) "Programar" [1]=> string(3) "Ler" [2]=> string(5) "Café" } echo "<br>"; var_dump($empresa); // NULL ?>
4. Constantes
define()
(tradicional) ou const
(a partir do PHP 5.3, geralmente dentro de classes ou namespaces).<?php define("EMPRESA", "Rocketseat"); const VERSAO_ATUAL = 1.0; echo EMPRESA; // Rocketseat echo "<br>"; echo VERSAO_ATUAL; // 1.0 ?>
5. Operadores
- Aritméticos:
+
(soma),-
(subtração),*
(multiplicação),/
(divisão),%
(módulo - resto da divisão).
- Atribuição:
=
(atribui valor),+=
(soma e atribui),-=
(subtrai e atribui),*=
(multiplica e atribui),/=
(divide e atribui),.=
(concatena e atribui).
- Comparação:
==
(igual),===
(identico - valor e tipo),!=
ou<>
(diferente),!==
(não idêntico),>
,<
,>=
,<=
.
- Lógicos:
&&
ouand
(E),||
ouor
(OU),!
(NÃO).
- Incremento/Decremento:
++$var
,$var++
,-$var
,$var--
.
<?php $num1 = 10; $num2 = 5; $soma = $num1 + $num2; // 15 $idade = 18; $podeDirigir = ($idade >= 18); // true $temLogin = true; $temPermissao = false; $podeAcessar = $temLogin && $temPermissao; // false ?>
Controlando o fluxo e reutilizando código: estruturas de controle e funções
1. Estruturas condicionais
if
,elseif
,else
: a estrutura mais comum. Executa blocos de código diferentes dependendo se uma condição é verdadeira ou falsa.
<?php $nota = 7.5; $nomeAluno = "Diego"; if ($nota >= 7.0) { echo "$nomeAluno, você foi aprovado!"; } elseif ($nota >= 5.0) { echo "$nomeAluno, você está de recuperação."; } else { echo "$nomeAluno, você foi reprovado."; } ?>
switch
: útil quando você precisa comparar uma variável com múltiplos valores específicos. Muitas vezes mais legível que vários elseif
encadeados para o mesmo tipo de comparação.<?php $statusPedido = "processando"; switch ($statusPedido) { case "pendente": echo "Seu pedido está aguardando pagamento."; break; // Importante! Sai do switch case "processando": echo "Seu pedido está sendo preparado para envio."; break; case "enviado": echo "Seu pedido foi enviado!"; break; default: echo "Status do pedido desconhecido."; } ?>
if
/else
simples, ótimo para atribuições condicionais. (condição) ? valor_se_verdadeiro : valor_se_falso;
<?php $idade = 20; $mensagem = ($idade >= 18) ? "Maior de idade" : "Menor de idade"; echo $mensagem; // Maior de idade ?>
2. Estruturas de repetição (loops)
for
: ideal quando você sabe exatamente quantas vezes quer repetir o bloco. Controla a inicialização, condição e incremento/decremento em uma única linha.
<?php // Exibe os números de 1 a 5 for ($i = 1; $i <= 5; $i++) { echo "Número: " . $i . "<br>"; } ?>
while
: repete um bloco de código enquanto uma condição especificada for verdadeira. A condição é verificada antes de cada iteração.<?php $contador = 0; while ($contador < 3) { echo "Contador while: " . $contador . "<br>"; $contador++; } ?>
do-while
: similar ao while
, mas com uma diferença crucial: garante que o bloco de código execute pelo menos uma vez, pois a condição é verificada depois da iteração.<?php $tentativa = 0; $conectou = false; // Simula que não conectou ainda do { echo "Tentando conexão... (tentativa " . ++$tentativa . ")<br>"; // Lógica de conexão aqui... if ($tentativa == 2) { // Simula sucesso na 2ª tentativa $conectou = true; echo "Conectado!<br>"; } } while (!$conectou && $tentativa < 3); if (!$conectou) { echo "Falha ao conectar após $tentativa tentativas.<br>"; } ?>
foreach
: a forma mais elegante e prática de iterar sobre os elementos de um array (ou propriedades de um objeto iterável). Abstrai o controle de índices ou ponteiros.<?php $cursos = ["PHP", "Laravel", "React", "Node.js"]; echo "Cursos da Rocketseat:<br>"; foreach ($cursos as $curso) { // Itera sobre os valores echo "- " . htmlspecialchars($curso) . "<br>"; // Boa prática escapar output } $instrutores = ["PHP" => "Mayk", "React" => "Diego", "Node.js" => "Rodrigo"]; echo "<br>Instrutores:<br>"; foreach ($instrutores as $tecnologia => $nome) { // Itera sobre chave e valor echo "- " . htmlspecialchars($tecnologia) . ": " . htmlspecialchars($nome) . "<br>"; } ?>
3. Funções
- Definindo e chamando funções: a sintaxe é simples, usando a palavra-chave
function
.
<?php // Define a função 'saudacao' que aceita um parâmetro $nome // $nome tem um valor padrão "Dev", usado se nenhum argumento for passado function saudacao($nome = "Dev") { // Retorna a string formatada return "Bem-vindo(a) à Rocketseat, " . htmlspecialchars($nome) . "!"; } // Chama a função passando um argumento $mensagemFernanda = saudacao("Fernanda"); echo $mensagemFernanda; // Exibe: Bem-vindo(a) à Rocketseat, Fernanda! echo "<br>"; // Chama a função sem passar argumento, usando o valor padrão $mensagemPadrao = saudacao(); echo $mensagemPadrao; // Exibe: Bem-vindo(a) à Rocketseat, Dev! ?>
- Parâmetros e retorno: funções podem receber múltiplos dados como entrada (parâmetros/argumentos) e podem retornar um valor usando a instrução
return
. Se uma função não tiver umreturn
explícito, ela retornaNULL
por padrão.
- Escopo de variáveis: é crucial entender o escopo. Variáveis definidas dentro de uma função (parâmetros ou criadas localmente) só existem dentro dela. Variáveis definidas fora não são automaticamente acessíveis dentro da função (a menos que passadas como argumento ou usando a palavra-chave
global
, que geralmente deve ser evitada por dificultar o rastreamento do fluxo de dados).
- Funções nativas: PHP vem com um arsenal gigantesco de funções prontas para usar, cobrindo manipulação de strings, arrays, datas, matemática, arquivos, redes e muito mais! Algumas muito úteis que você usará frequentemente:
strlen($string)
: retorna o comprimento (número de bytes/caracteres) de uma string.str_replace($busca, $substitui, $string)
: substitui todas as ocorrências de$busca
por$substitui
em$string
.count($array)
: conta o número de elementos em um array (ou propriedades de um objeto).date($formato, $timestamp = null)
: formata uma data/hora local. Se$timestamp
não for fornecido, usa a hora atual.implode($separador, $array)
: junta os elementos de um array em uma única string, usando$separador
entre eles.explode($delimitador, $string)
: divide uma string em um array, usando$delimitador
como ponto de quebra.isset($variavel)
: verifica se uma variável foi definida e seu valor não éNULL
. Essencial antes de acessar índices de array ou propriedades de objeto que podem não existir.empty($variavel)
: verifica se uma variável é considerada "vazia" (p.ex.,''
,0
,'0'
,null
,false
,[]
). Útil para verificar se um formulário foi preenchido, por exemplo.
Organização e escalabilidade: PHP orientado a objetos (OOP)
- Abstração: focar no essencial, escondendo detalhes complexos.
- Encapsulamento: proteger os dados internos de um objeto, expondo apenas o necessário através de interfaces controladas (métodos).
- Reutilização: herança permite criar novas classes baseadas em existentes, reaproveitando código.
- Manutenção: código mais organizado é mais fácil de entender, modificar e depurar.
- Classe: a planta, o molde para criar objetos. Define as propriedades (características) e métodos (ações) que os objetos desse tipo terão.
<?php class Curso { // Propriedades (Atributos) public $nome; // Acessível de qualquer lugar private $cargaHoraria; // Acessível apenas dentro desta classe protected $instrutor; // Acessível aqui e em classes filhas // Construtor: Método especial chamado ao criar um objeto (new) public function __construct($nome, $cargaHoraria, $instrutor = "A definir") { $this->nome = $nome; // '$this' se refere ao objeto atual $this->setCargaHoraria($cargaHoraria); $this->instrutor = $instrutor; echo "Curso '{$this->nome}' criado!<br>"; } // Métodos (Ações) public function getNome() { return $this->nome; } public function setCargaHoraria($horas) { if ($horas > 0) { $this->cargaHoraria = $horas; } else { $this->cargaHoraria = 10; // Valor padrão mínimo } } public function getCargaHoraria() { return $this->cargaHoraria; } // Destrutor: Chamado quando o objeto é destruído public function __destruct() { // echo "Curso '{$this->nome}' destruído.<br>"; // Útil para liberar recursos } } ?>
<?php // Inclua a definição da classe Curso aqui... // Criando objetos (instanciando a classe) $cursoPHP = new Curso("Formação PHP Completa", 80, "Isabela"); $cursoJS = new Curso("JavaScript Moderno", 60); // Acessando propriedades e métodos públicos echo "Nome do curso: " . $cursoPHP->getNome() . "<br>"; // Formação PHP Completa echo "Carga horária: " . $cursoPHP->getCargaHoraria() . " horas<br>"; // 80 horas // $cursoPHP->cargaHoraria = -10; // Erro! 'cargaHoraria' é private $cursoPHP->setCargaHoraria(-10); // Usa o método para validar echo "Nova carga horária: " . $cursoPHP->getCargaHoraria() . " horas<br>"; // 10 horas (valor mínimo) var_dump($cursoJS); ?>
public
, private
e protected
. Isso protege o estado interno do objeto. Getters (como getNome()
) e Setters (como setCargaHoraria()
) são métodos usados para acessar e modificar propriedades privadas/protegidas de forma controlada.extends
): permite que uma classe (filha) herde propriedades e métodos de outra classe (pai), promovendo a reutilização.<?php // ... (classe Curso definida acima) ... class CursoOnline extends Curso { // Herda de Curso public $plataforma = "Rocketseat Platform"; public function exibirDetalhes() { // Acessa método público da classe pai echo "Curso: " . $this->getNome() . "<br>"; // Acessa propriedade protegida da classe pai echo "Instrutor: " . $this->instrutor . "<br>"; // Acessa propriedade da própria classe echo "Plataforma: " . $this->plataforma . "<br>"; } } $cursoLaravel = new CursoOnline("Laravel Avançado", 50, "Mayk"); $cursoLaravel->exibirDetalhes(); ?>
- Interfaces: contratos que definem quais métodos uma classe deve implementar.
- Classes abstratas: classes que não podem ser instanciadas diretamente, servindo como base para outras classes.
- Traits: permitem reutilizar métodos em classes não relacionadas (uma forma de "herança horizontal").
- Namespaces: evitam conflitos de nomes entre classes de diferentes bibliotecas ou partes do seu projeto.
- Autoloading (PSR-4): padrão para carregar arquivos de classe automaticamente quando são necessários, geralmente gerenciado pelo Composer.

Interagindo com o mundo exterior: manipulação de arquivos e banco de dados
1. Manipulação de arquivos
- Ler um arquivo inteiro:
file_get_contents('arquivo.txt')
- Escrever em um arquivo (sobrescrevendo):
file_put_contents('log.txt', 'Nova entrada de log\n')
- Adicionar a um arquivo:
file_put_contents('log.txt', 'Outra entrada\n', FILE_APPEND)
- Controle fino (abrir, ler/escrever, fechar):
fopen()
,fread()
,fwrite()
,fgets()
(ler linha),fclose()
. Mais complexo, mas oferece mais controle.
<?php $logMessage = date('[Y-m-d H:i:s]') . " Usuário 'Rodrigo' acessou o dashboard.\n"; file_put_contents('activity.log', $logMessage, FILE_APPEND); echo "Log registrado com sucesso!"; ?>
2. Interação com banco de dados: o poder do PDO
- Abstração: seu código PHP para interagir com o banco muda pouco ou nada se você trocar MySQL por PostgreSQL, por exemplo.
- Segurança: oferece suporte nativo a Prepared Statements, a principal defesa contra ataques de SQL Injection.
- Conectar ao banco:
<?php $host = 'localhost'; // ou IP do servidor DB $db = 'rocketseat_cursos'; // Nome do banco de dados $user = 'root'; // Usuário do banco $pass = 'exemplo_senha'; // Senha do banco $charset = 'utf8mb4'; // DSN (Data Source Name) - string de conexão $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // Lança exceções em caso de erro PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // Retorna arrays associativos por padrão PDO::ATTR_EMULATE_PREPARES => false, // Usa prepared statements nativos ]; try { $pdo = new PDO($dsn, $user, $pass, $options); // echo "Conectado ao banco '$db' com sucesso!"; } catch (\PDOException $e) { // Em produção: logar o erro, não exibir detalhes sensíveis throw new \PDOException($e->getMessage(), (int)$e->getCode()); // die("Erro ao conectar ao banco de dados: " . $e->getMessage()); } ?>
try...catch
para lidar com possíveis erros de conexão.- Executar queries (COM PREPARED STATEMENTS!)
<?php // --- Supondo que a conexão $pdo já existe --- // INSERT (Inserir dados) $nomeCurso = "Formação PHP Completa"; $cargaHoraria = 80; $sql_insert = "INSERT INTO cursos (nome, carga_horaria) VALUES (?, ?)"; $stmt_insert = $pdo->prepare($sql_insert); // $stmt_insert->execute([$nomeCurso, $cargaHoraria]); // Passa os valores em um array // Ou usando placeholders nomeados: $sql_insert_named = "INSERT INTO cursos (nome, carga_horaria) VALUES (:nome, :carga)"; $stmt_insert_named = $pdo->prepare($sql_insert_named); // $stmt_insert_named->execute(['nome' => $nomeCurso, 'carga' => $cargaHoraria]); // $idInserido = $pdo->lastInsertId(); // Pega o ID do último registro inserido // SELECT (Buscar dados) $busca = "PHP"; $sql_select = "SELECT * FROM cursos WHERE nome LIKE ?"; // Busca cursos com 'PHP' no nome $stmt_select = $pdo->prepare($sql_select); $stmt_select->execute(["%$busca%"]); // % é um curinga SQL $cursosEncontrados = $stmt_select->fetchAll(); // Pega todos os resultados como array associativo echo "<h2>Cursos encontrados com '$busca':</h2>"; if ($cursosEncontrados) { echo "<ul>"; foreach ($cursosEncontrados as $curso) { echo "<li>" . htmlspecialchars($curso['nome']) . " (" . $curso['carga_horaria'] . "h)</li>"; } echo "</ul>"; } else { echo "Nenhum curso encontrado."; } // UPDATE (Atualizar dados) $idCursoAtualizar = 1; // Supondo que o curso com ID 1 existe $novaCarga = 90; $sql_update = "UPDATE cursos SET carga_horaria = :carga WHERE id = :id"; $stmt_update = $pdo->prepare($sql_update); // $stmt_update->execute(['carga' => $novaCarga, 'id' => $idCursoAtualizar]); // echo "Curso atualizado: " . $stmt_update->rowCount(); // Número de linhas afetadas // DELETE (Remover dados) $idCursoDeletar = 2; $sql_delete = "DELETE FROM cursos WHERE id = ?"; $stmt_delete = $pdo->prepare($sql_delete); // $stmt_delete->execute([$idCursoDeletar]); // echo "Curso deletado: " . $stmt_delete->rowCount(); // Número de linhas afetadas ?>
htmlspecialchars()
ao exibir dados vindos do banco para prevenir XSS (veremos mais sobre segurança).Acelerando o desenvolvimento: frameworks populares de PHP

O que é um framework e por que usar?
- Estrutura: uma organização de pastas e arquivos padronizada (geralmente seguindo o padrão MVC - Model-View-Controller).
- Componentes reutilizáveis: ferramentas prontas para tarefas comuns como roteamento (URLs amigáveis), ORM (mapeamento objeto-relacional para banco de dados), sistemas de template (separar HTML do PHP), autenticação, validação de formulários, envio de emails, e muito mais.
- Segurança: frameworks populares já vêm com proteções embutidas contra ataques comuns (como CSRF e, indiretamente, facilitam a prevenção de XSS e SQL Injection).
- Boas práticas: incentivam o uso de padrões de projeto, OOP e código mais limpo.
- Comunidade e ecossistema: suporte, documentação extensa, pacotes adicionais.
Os gigantes do PHP: Laravel e Symfony
- Laravel: atualmente, é o framework PHP mais popular do mundo. Conhecido por sua sintaxe elegante, foco na "felicidade do desenvolvedor" (developer happiness), ecossistema rico (Forge, Vapor, Nova, Octane) e uma comunidade imensa. É extremamente produtivo para construir desde APIs RESTful até aplicações web completas, de pequeno a grande porte. Ideal para quem busca rapidez e um conjunto completo de ferramentas "out-of-the-box".
- Symfony: um framework robusto e altamente flexível, composto por um conjunto de componentes PHP desacoplados e reutilizáveis (muitos dos quais são usados pelo próprio Laravel!). É uma escolha sólida para aplicações complexas, de larga escala e de longa duração, onde a flexibilidade e a arquitetura bem definida são cruciais. Empresas e projetos grandes frequentemente optam por Symfony.
- CodeIgniter: conhecido por sua simplicidade, leveza e excelente documentação. Ótima opção para iniciantes em frameworks ou projetos menores.
- CakePHP: outro framework veterano com foco em convenção sobre configuração e desenvolvimento rápido.
Código seguro e profissional: segurança e boas práticas em PHP
Principais vulnerabilidades e como prevenir:
- SQL Injection:
- Risco: permite que um atacante manipule suas queries SQL, podendo roubar, modificar ou deletar dados.
- Prevenção: use Prepared Statements (com PDO ou o ORM do seu framework). Nunca concatene input do usuário diretamente na query.
- Cross-Site Scripting (XSS):
- Risco: injeta scripts maliciosos (geralmente JavaScript) nas páginas vistas por outros usuários, podendo roubar sessões, cookies ou redirecionar para sites falsos.
- Prevenção: escape dados de saída que vieram de fontes não confiáveis (usuários, banco de dados) antes de exibi-los no HTML. Use
htmlspecialchars($variavel, ENT_QUOTES, 'UTF-8')
. Frameworks geralmente têm helpers para isso nos templates. PHP
<?php // $_POST['comentario'] veio de um formulário $comentarioUsuario = $_POST['comentario'] ?? ''; // Exibição SEGURA: echo '<p>' . htmlspecialchars($comentarioUsuario, ENT_QUOTES, 'UTF-8') . '</p>'; ?>
- Cross-Site Request Forgery (CSRF):
- Risco: engana um usuário autenticado para executar ações indesejadas na aplicação sem o seu conhecimento (ex: transferir fundos, deletar conta).
- Prevenção: use tokens anti-CSRF em todos os formulários que realizam ações de escrita (POST, PUT, DELETE). Frameworks como Laravel e Symfony geralmente lidam com isso automaticamente.
- Gerenciamento de Senhas:
- Risco: armazenar senhas em texto plano ou com hash inseguro (MD5, SHA1) facilita o roubo em caso de vazamento de dados.
- Prevenção: use as funções
password_hash()
(para criar o hash ao salvar/atualizar senha) epassword_verify()
(para verificar a senha no login). Elas usam algoritmos fortes (como bcrypt) e incluem "salts" automaticamente.
- Inclusão de Arquivos e Uploads:
- Risco: incluir arquivos com base em input do usuário (
include $_GET['pagina']
) ou permitir uploads sem validação pode levar à execução de código remoto ou sobrecarga do servidor. - Prevenção: valide rigorosamente qualquer caminho de arquivo vindo do usuário. Para uploads, valide tipo MIME, extensão, tamanho máximo e armazene os arquivos fora da raiz pública do site, se possível, ou com nomes aleatórios e permissões restritas.
Boas práticas essenciais:
- Composer: use o Composer para gerenciar as dependências (bibliotecas externas) do seu projeto. Mantenha as dependências atualizadas (
composer update
).
- PSRs (PHP Standards Recommendations): siga os padrões da comunidade, especialmente:
- PSR-12 (Extended Coding Style): padroniza a formatação do código (espaços, indentação, etc.). Use ferramentas como PHP-CS-Fixer ou Pint (Laravel) para automatizar.
- PSR-4 (Autoloader): padrão para carregamento automático de classes.
- Tratamento de erros: configure
error_reporting
edisplay_errors
adequadamente: mostre todos os erros em ambiente de desenvolvimento, mas em produção, desabilite a exibição e registre os erros em logs. Use blocostry...catch
para lidar com exceções de forma graciosa.
- Código limpo: escreva código legível. Use nomes claros para variáveis e funções. Mantenha funções e métodos curtos e focados em uma única tarefa. Evite código duplicado (princípio DRY).
- Versionamento (Git): use Git (e plataformas como GitHub, GitLab, Bitbucket) para controlar as versões do seu código, facilitar o trabalho em equipe e ter um histórico seguro.
Mãos à obra: ideias de projetos práticos para exercitar
- Calculadora de mensalidade: um formulário simples onde o usuário seleciona um curso (com valor base) e talvez um cupom de desconto, e o PHP calcula o valor final.
- Formulário de inscrição em evento: coleta nome, email e talvez a área de interesse do dev. Valida os dados no backend e salva em um arquivo de log ou (melhor ainda) em uma tabela simples no banco de dados usando PDO.
- Sistema de login básico: uma página de login que verifica usuário e senha (armazenada com
password_hash()
) no banco. Se válido, cria uma sessão ($_SESSION
) para manter o usuário logado e redireciona para uma página de "dashboard" simples. Inclui uma página de logout.
- CRUD de conteúdos educacionais: um sistema para Criar, Ler, Atualizar e Deletar (CRUD) pequenos artigos ou dicas de programação. Use PHP puro com PDO e organize o código minimamente (talvez separando HTML e PHP).
- Blog educacional simples: crie posts com título e conteúdo, exiba uma lista de posts na home, e permita visualizar cada post individualmente. Bônus: Adicione categorias ou comentários simples.
- Comece simples: não tente construir um clone do Facebook logo de cara! Escolha um projeto pequeno e adicione funcionalidades aos poucos.
- Use Git: desde o primeiro
echo "Hello World!"
do seu projeto, inicialize um repositório Git. Faça commits frequentes.
- Não tenha medo de errar: erros fazem parte do processo. Use
var_dump()
, logs e ferramentas de debug para entender o que está acontecendo.
- Consulte a documentação: tenha a documentação do PHP sempre aberta.
Indo além: recursos essenciais para aprofundamento
- Documentação oficial do PHP : Sua fonte número 1! É completa, bem organizada e tem exemplos para quase todas as funções e conceitos. Aprenda a navegar e pesquisar nela.
- Documentação dos Frameworks: Se você decidir usar Laravel, Symfony ou outro, a documentação oficial deles é o melhor lugar para aprender suas particularidades.
- Blog da Rocketseat: Continue explorando nossos conteúdos! Temos diversos artigos e tutoriais que se aprofundam em tópicos específicos.
- Comunidades Online:
- Stack Overflow: Para tirar dúvidas específicas (pesquise antes de perguntar!).
- Fóruns e Grupos: Aqui fica um convite, para que você participe da maior comunidade de desenvolvedores da america latina.
- GitHub: Explore projetos open-source em PHP para ver como outros devs estruturam seu código.
Conclusão: decole sua carreira com PHP!
- ✅ Projetos práticos e completos que simulam desafios reais do mercado.
- ✅ Suporte personalizado via IA da Rocketseat e nossa equipe de Sucesso do Aluno para nunca te deixar travar.
- ✅ Tutorias individuais e em grupo para discutir seus estudos e carreira.
- ✅ Mentoria de Carreira em 5 encontros focada em autoconhecimento, comunicação, LinkedIn, portfólio e mais!
- ✅ Eventos ao vivo como o "Café com os Instrutores".
- ✅ Talent Space: Eventos exclusivos com empresas parceiras para impulsionar sua carreira.
O universo PHP te espera. Bora codar.
Explore conteúdos relacionados
Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.