Refatoração de código legado em PHP: guia passo a passo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que a refatoração de código legado não é um luxo, mas uma necessidade



Todo desenvolvedor PHP, mais cedo ou mais tarde, se depara com código legado. Pode ser um projeto escrito há 10 anos em PHP 5.3, ou uma aplicação que "simplesmente funciona", mas causa dor a cada alteração. Refatorar esse código não é apenas "dar uma arrumada" no estilo, mas um processo criticamente importante que aumenta a capacidade de manutenção, o desempenho e a segurança da aplicação.



Neste artigo, vamos analisar abordagens práticas para refatorar código PHP legado, usando recursos modernos da linguagem (PHP 7.4–8.3) e padrões comprovados. Você aprenderá como fazer alterações com segurança, sem quebrar o sistema em funcionamento.



1. Avaliação e documentação do estado atual



O primeiro e mais importante passo é entender com o que você está lidando. Não tente refatorar às cegas.



1.1. Crie um mapa de dependências

Use ferramentas como PhpMetrics ou Deptrac para visualizar as conexões entre as classes. Isso ajudará a identificar "objetos divindade" (god objects) e dependências cíclicas.



// Exemplo de uma classe "divindade" típica em código legadoclass UserManager {    public function save($data) {        // 200 linhas de código: validação, envio de email, logging, trabalho com BD    }        public function sendNewsletter() {        // Mais 150 linhas    }        public function generateReport() {        // E mais 100 linhas    }}


1.2. Escreva testes de caracterização

Antes de alterar o código, certifique-se de que o comportamento atual está documentado com testes. Use a abordagem "Golden Master" (snapshot testing):



// Teste que fixa o comportamento atualpublic function testLegacyCalculation(): void{    $calculator = new OldCalculator();    $result = $calculator->compute(10, 20);        // Se não houver especificação, apenas salve o resultado    $this->assertSame(30, $result);}


Dica: Se o projeto não tiver nenhum teste, comece com testes de integração nas operações críticas de negócio. Use PHPUnit com vfsStream para isolar o sistema de arquivos.



2. Melhoria gradual: de funções globais para POO



Grande parte do código PHP legado consiste em funções globais e estilo procedural. A migração gradual para POO é uma etapa chave da refatoração.



2.1. Encapsulamento de funções globais

Substitua funções globais por métodos estáticos de classe e, em seguida, por serviços completos.



// Era: função globalfunction send_email($to, $subject, $message) {    mail($to, $subject, $message);}

// Agora: classe de serviçoclass MailService { public function __construct( private MailerInterface $mailer ) {} public function send(string $to, string $subject, string $message): bool { return $this->mailer->send($to, $subject, $message); }}


2.2. Livrando-se de variáveis globais

Variáveis globais ($GLOBALS, $_SESSION diretamente) são a principal fonte de bugs. Use o padrão Registry ou injeção de dependência (DI).



// Ruim: trabalho direto com variáveis globaisfunction getCurrentUser() {    global $db;    $id = $_SESSION['user_id'];    return $db->query("SELECT * FROM users WHERE id = $id");}

// Bom: injeção explícita de dependênciasclass UserProvider { public function __construct( private PDO $db, private SessionInterface $session ) {} public function getCurrentUser(): ?User { $id = $this->session->get('user_id'); return $this->db->query('SELECT * FROM users WHERE id = ?', [$id]); }}


3. Substituição segura de construções obsoletas



O PHP evolui, e muitas construções antigas se tornaram inseguras e

Blogs

Book Recommendations