Dominando o PHP

Dominando o PHP

A série começa pelo terreno: o que a linguagem é hoje, onde ela realmente roda e por que tanto tutorial para no meio do caminho. Um mapa dos onze módulos que vêm pela frente, do primeiro echo ao projeto completo, e o critério que guia cada escolha ao longo do ano.
PHP

12 min de leitura

Se você chegou até aqui, provavelmente já ouviu alguém dizer que "PHP está morto". Talvez tenha lido isso num fórum, num comentário do YouTube ou num artigo sensacionalista. A realidade, porém, conta uma história muito diferente. E é por isso que estudar PHP hoje em dia (2026) pode ser útil e prazeroso.

PHP alimenta mais de 76% de todos os sites com backend conhecido na web. Isso inclui o WordPress, o Facebook (que nasceu em PHP e até hoje mantém o Hack, um dialeto derivado dele), o Wikipedia, o Slack em suas origens, e milhares de sistemas empresariais que movimentam bilhões de reais por dia. Não é uma linguagem moribunda — é uma linguagem madura, battle-tested, e em constante evolução.

Mas o problema real não é o PHP em si.

O problema é a forma como ele é ensinado.

O ciclo vicioso do ensino incompleto

Você provavelmente já viveu isso: começa um curso ou uma série de artigos animado. Aprende variáveis, condicionais, loops. Talvez chegue até funções. Num ponto mais avançado, aparece algo sobre banco de dados com mysqli_connect() e uns echo espalhados no meio do HTML.

E para por aí.

Ninguém te mostra o que vem depois. Ninguém te mostra como um sistema PHP de verdade é estruturado. Você termina o curso sabendo fazer um formulário de contato, mas sem a menor ideia de como construir algo que possa ser mantido, escalado ou entregue num ambiente profissional.

Esse gap entre "aprender PHP" e "trabalhar com PHP" é enorme — e é exatamente ele que esta série quer eliminar.

O que é PHP, afinal?

PHP (Hypertext Preprocessor, originalmente Personal Home Page) é uma linguagem de script interpretada, de tipagem dinâmica, originalmente projetada para desenvolvimento web server-side. Criada por Rasmus Lerdorf em 1994, ela nasceu de uma necessidade prática: rastrear visitas a um currículo online. O que começou como um conjunto de scripts CGI em C virou uma das linguagens mais influentes da história da internet.

Tecnicamente, o PHP roda no servidor, processa a requisição HTTP, interage com banco de dados, aplica lógica de negócio e devolve uma resposta — normalmente HTML, JSON ou XML — ao cliente. Ele pode ser executado como módulo do Apache, via PHP-FPM com Nginx, como CLI para scripts de automação, ou até como processo assíncrono com extensões como Swoole e ReactPHP.

Com o PHP 8.x, a linguagem ganhou recursos que a colocam no mesmo patamar de expressividade de Python e Ruby moderno: JIT compiler, union types, named arguments, fibers para concorrência, match expressions, enums, readonly properties, e muito mais. Não é a linguagem bagunçada dos anos 2000 que muita gente ainda imagina.

Onde e como ele é usado hoje?

E-commerce: Magento, WooCommerce e sistemas customizados em Laravel processam pagamentos, estoques e logística de algumas das maiores lojas virtuais do mundo.

CMS e portais de conteúdo: WordPress, Drupal e Joomla dominam o mercado de gerenciamento de conteúdo. Só o WordPress representa 43% de todos os sites da internet.

SaaS e sistemas empresariais: Ferramentas de gestão, ERPs, plataformas de RH e sistemas financeiros são construídos diariamente com Laravel, Symfony e Slim Framework por equipes que valorizam produtividade e ecossistema maduro.

APIs e microsserviços: Com frameworks modernos e o padrão PSR, PHP é uma escolha legítima e performática para expor APIs REST e GraphQL consumidas por aplicações mobile e frontend desacoplado.

Automação e CLI: Scripts de processamento de dados, pipelines de integração, tarefas agendadas via cron — PHP tem suporte robusto para tudo isso com sua poderosa CLI.

Por que esta série é diferente

A maioria dos conteúdos sobre PHP te ensina o que é a linguagem. Esta série quer te mostrar como pensar com ela.

Você vai acompanhar a evolução natural de um desenvolvedor PHP: partindo dos fundamentos reais da linguagem, passando pela orientação a objetos aplicada com intenção, entendendo bancos de dados além do SELECT *, estruturando projetos com Composer e boas práticas PSR, dominando o Laravel, construindo APIs seguras e testadas — até chegar num projeto completo que conecta todos esses pontos.

Cada módulo foi pensado para que você não apenas entenda o conceito, mas veja ele se transformar em código real, com decisões arquiteturais justificadas, erros comuns apontados, e o caminho de evolução sempre claro à sua frente.

Porque o objetivo não é apenas aprender PHP. É aprender a construir sistemas com PHP — e entender por que cada escolha importa.

O que você vai aprender

Módulo Tema
1 Fundamentos + História do PHP
2 Funções e Manipulação de Dados
3 Orientação a Objetos (POO)
4 Bancos de Dados: MySQL, PostgreSQL, SQLite, MongoDB
5 Web com PHP (Forms, Sessions, Cookies)
6 PHP Moderno (Composer, Namespaces, PSR, Boas Práticas)
7 Laravel
8 APIs REST
9 Segurança
10 Testes e Qualidade
11 Projeto Final

Para quem é esta série?

Para quem está começando e quer construir uma base sólida desde o início, sem os vícios que o ensino rápido e fragmentado costuma criar. Para quem já sabe "um pouco de PHP" mas sente que falta o próximo nível — aquele que separa quem faz funcionar de quem faz funcionar direito. E para quem quer ter, ao final, um projeto real no portfólio que demonstre domínio técnico de verdade.

Não existe atalho para competência. Mas existe um caminho bem mapeado.

Fontes e leituras recomendadas

Oficiais

  • Manual do PHP — A documentação oficial, boa parte traduzida para português, com os comentários da comunidade em cada função.
  • PHP — Histórico de versões — O que mudou em cada versão e, sobretudo, quais ainda recebem correções de segurança — informação que decide o que usar em produção.

Padrões e boas práticas

  • PHP: The Right Way — Guia comunitário que separa a prática atual do que ficou para trás. Antídoto direto contra tutorial desatualizado, que é o problema central deste artigo.
  • PSRs — PHP-FIG — As recomendações que padronizam autoload, estilo de código, interfaces HTTP e contêiner de dependências — a base da interoperabilidade entre frameworks.

Ferramentas

  • Composer — Documentação — O gerenciador de dependências que organizou o ecossistema, com o autoload PSR-4 que tornou obsoleto o include manual.
  • Packagist — O repositório central de pacotes, onde se avalia manutenção, downloads e compatibilidade antes de adotar uma biblioteca.

Exercícios

Exercício 1

Você cita em uma reunião que "PHP roda mais de 76% da web" e alguém rebate: "esse número é propaganda". O que ele mede de fato, e o que não mede?

Ver resposta

✓ Resposta: O número vem do W3Techs e mede uma coisa específica: entre os sites cuja linguagem de servidor é detectável, qual fatia responde PHP. Já aí há três limites. Primeiro, só entra site que se deixa identificar — cabeçalho X-Powered-By, cookie de sessão, extensão de arquivo; quem está atrás de CDN ou removeu esses sinais fica de fora da conta. Segundo, a unidade é site, não requisição: um blog parado e um portal com milhões de acessos pesam igual, então o número não diz nada sobre volume de tráfego. Terceiro, a fatia é puxada pelo WordPress, que sozinho responde por perto de 43% de todos os sites — não é que 76% das equipes escolheram PHP, é que a maioria dos sites do mundo é WordPress. E ele não mede o que mais interessa a quem decide: quantos projetos novos estão nascendo em PHP. A leitura honesta do dado é esta: prova longevidade e um mercado gigante de manutenção, não superioridade técnica nem tendência. Usar o número como argumento de qualidade é o erro que dá razão a quem rebateu.

Exercício 2

Você assume a manutenção de um sistema em PHP 7.4 que "funciona bem e ninguém quer mexer". Qual é o primeiro problema a apontar, e por onde se começa?

Ver resposta

✓ Resposta: O problema não é desempenho nem estilo de código: é que o 7.4 não recebe correção de segurança desde novembro de 2022. Toda falha descoberta depois disso continua aberta nesse servidor. Em setembro de 2026, quem recebe correção é só o 8.4 e o 8.5 (suporte ativo) e o 8.2 e o 8.3 (apenas segurança) — o ramo 7 inteiro e o 8.0/8.1 estão fora. "Funciona bem" descreve o comportamento observável, não o risco. E o primeiro passo não é reescrever: é subir a versão, que costuma ser menos trabalhoso do que a lenda sugere, porque as quebras do 8.x são conhecidas e catalogadas. O caminho prático é rodar composer why-not php 8.4 para ver qual dependência trava a subida, apontar o PHPStan no nível mais baixo que passe, usar o Rector com o conjunto de regras da versão-alvo para a parte mecânica, e só então subir em homologação com as extensões conferidas uma a uma — php -m na máquina antiga e na nova, comparando. Reescrever um sistema que funciona é a decisão mais cara que existe; atualizar a versão é a mais barata que resolve o risco real.

Exercício 3

Um script de importação processa 80 mil linhas e leva cerca de 40 minutos. Chamado pelo navegador, ele morre no meio, sem erro claro no log da aplicação. Onde está o problema?

Ver resposta

✓ Resposta: O problema é o caminho escolhido, não o script. Uma requisição HTTP atravessa uma fila de limites de tempo e o menor deles vence: o max_execution_time do PHP (30 segundos por padrão), o request_terminate_timeout do pool do PHP-FPM, o fastcgi_read_timeout do Nginx (ou o ProxyTimeout do Apache), e ainda o tempo que o navegador e qualquer proxy no meio aceitam esperar. Aumentar só o primeiro não resolve — é por isso que o script "morre sem erro": quem cortou a conexão foi uma camada que nem sabe o que é PHP. Há um agravante: enquanto esse processo ocupa um worker do FPM por 40 minutos, ele sai do pool de atendimento, e pm.max_children é um número pequeno. Meia dúzia de importações simultâneas derrubam o site inteiro. A saída é tirar a tarefa longa da requisição: rodar pela CLI, onde o max_execution_time vale 0 por padrão (sem limite), acionada por cron ou por uma fila de jobs. A requisição, então, só enfileira e responde na hora — e o navegador acompanha o progresso consultando o estado, em vez de segurar a conexão aberta.

Exercício 4

Um tutorial popular ensina a listar usuários assim. Aponte o que falta para esse código ser aceitável em produção — e qual dos problemas é o mais grave.

<?php
$con = mysqli_connect("localhost", "root", "", "loja");
$busca = $_GET['busca'];
$sql = "SELECT * FROM usuarios WHERE nome LIKE '%$busca%'";
$res = mysqli_query($con, $sql);
while ($u = mysqli_fetch_assoc($res)) {
    echo "<li>" . $u['nome'] . "</li>";
}
Ver resposta

✓ Resposta: O mais grave é a injeção de SQL: $_GET['busca'] entra na consulta por interpolação de string, então quem controla a URL controla o SQL. Isso não se resolve com addslashes nem escapando à mão — resolve-se com prepared statement, em que o valor viaja separado do comando: $stmt = $pdo->prepare('SELECT nome FROM usuarios WHERE nome LIKE ?'); $stmt->execute(["%{$busca}%"]);. Em segundo lugar vem o XSS: o nome vindo do banco é impresso cru, e um cadastro com <script> vira código executando no navegador de quem lista — a saída precisa de htmlspecialchars($u['nome'], ENT_QUOTES, 'UTF-8'). Depois, três defeitos silenciosos: o SELECT * traz colunas que ninguém pediu (inclusive o hash da senha, que passa a trafegar sem necessidade); não há tratamento de erro algum, porque o mysqli procedural devolve false em silêncio em vez de lançar exceção; e credencial de banco está escrita no arquivo, com usuário root e senha vazia. Repare no que não está na lista: usar mysqli em vez de PDO não é o problema. O problema é misturar conexão, consulta e apresentação em oito linhas, sem fronteira nenhuma entre entrada do usuário, comando e saída.

Exercício 5

Desafio: pedem que você construa um chat com cinco mil conexões simultâneas. O PHP dá conta? Defenda sua resposta com o modelo de execução da linguagem.

Ver resposta

✓ Resposta: Dá, mas não do jeito clássico — e entender por quê vale mais do que a resposta. O modelo tradicional do PHP é um processo por requisição, que nasce, responde e morre: o estado é descartado no fim, o que simplifica enormemente a vida do programador e é justamente o que torna o modelo inadequado para conexão persistente. Com PHP-FPM, cada conexão aberta ocupa um worker; pm.max_children costuma ficar na casa das dezenas, porque cada worker carrega um interpretador inteiro na memória. Cinco mil conexões simultâneas nesse modelo exigiriam cinco mil processos — não é questão de ajustar configuração, é o modelo errado para o problema. As saídas reais são três. A primeira é usar um runtime de event loop em PHP: Swoole, OpenSwoole ou ReactPHP mantêm o processo vivo e multiplexam milhares de conexões em poucos processos, ao custo de um modelo de memória diferente (estado que sobrevive entre requisições vaza, e vazar em processo longevo é um problema novo para quem vem do PHP clássico). A segunda é Laravel Reverb, servidor WebSocket em PHP que já embrulha isso. A terceira, e a mais comum em produção, é não fazer o WebSocket em PHP: um serviço dedicado cuida das conexões e o PHP continua sendo a API que autentica, autoriza e persiste. A resposta profissional não é "PHP não serve", nem "serve para tudo" — é saber qual parte do problema cabe a qual ferramenta.

Comentários

Mais em PHP

Strings em Profundidade
Strings em Profundidade

Texto em PHP é sequência de bytes, e é dessa decisão que vêm quase todas as…

PHP 8.x Moderno
PHP 8.x Moderno

Enums, readonly, atributos e fibers mudaram o que se considera código PHP…

A História do PHP: de script pessoal a pilar da web
A História do PHP: de script pessoal a pilar da web

De um script para contar visitas a um currículo até a linguagem que move boa…