Princípios SOLID em PHP: guia completo com exemplos de código

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 SOLID é a base do código PHP de qualidade

\n\n

Todo desenvolvedor PHP, mais cedo ou mais tarde, enfrenta o problema do "código espaguete": classes ficam sobrecarregadas, mudanças em um lugar quebram toda a aplicação e os testes se tornam um pesadelo. A solução para esse problema são os princípios SOLID. Desenvolvidos por Robert Martin (Tio Bob), esses cinco princípios da programação orientada a objetos ajudam a criar código flexível, sustentável e escalável.

\n\n

Neste artigo, vamos analisar cada um dos cinco princípios SOLID com exemplos práticos em PHP. Você aprenderá como aplicá-los em projetos reais e verá a diferença entre código "ruim" e "bom". O material é adequado tanto para iniciantes quanto para desenvolvedores experientes que desejam sistematizar seus conhecimentos.

\n\n

1. Single Responsibility Principle (SRP) — Princípio da Responsabilidade Única

\n\n

Essência do princípio

\n

Uma classe deve ter apenas um motivo para ser alterada. Isso significa que cada módulo ou classe é responsável por uma tarefa específica.

\n\n

Exemplo ruim (violação do SRP)

\n
<?php\nclass Report {\n    public function generateReport($data) {\n        // Geração dos dados do relatório\n        $report = "Relatório: " . json_encode($data);\n\n        // Salvamento em arquivo\n        file_put_contents('report.txt', $report);\n\n        // Envio por email\n        mail('admin@example.com', 'Novo relatório', $report);\n\n        return $report;\n    }\n}\n?>
\n

Aqui, a classe Report faz três coisas diferentes: gera o relatório, salva e o envia. Alterar a lógica de envio de email quebrará a geração do relatório.

\n\n

Exemplo bom (cumprimento do SRP)

\n
<?php\nclass ReportGenerator {\n    public function generate(array $data): string {\n        return "Relatório: " . json_encode($data);\n    }\n}\n\nclass ReportSaver {\n    public function save(string $report, string $filename): void {\n        file_put_contents($filename, $report);\n    }\n}\n\nclass ReportMailer {\n    public function send(string $report, string $email): void {\n        mail($email, 'Novo relatório', $report);\n    }\n}\n\n// Uso\n$generator = new ReportGenerator();\n$report = $generator->generate($data);\n\n$saver = new ReportSaver();\n$saver->save($report, 'report.txt');\n\n$mailer = new ReportMailer();\n$mailer->send($report, 'admin@example.com');\n?>
\n

Agora cada classe tem uma única responsabilidade, e alterar a forma de salvamento não afetará o envio de email.

\n\n

2. Open/Closed Principle (OCP) — Princípio Aberto/Fechado

\n\n

Essência do princípio

\n

Entidades de software devem estar abertas para extensão, mas fechadas para modificação. Em outras palavras, você deve ser capaz de adicionar nova funcionalidade sem alterar o código existente.

\n\n

Exemplo ruim (violação do OCP)

\n
<?php\nclass PaymentProcessor {\n    public function process($type, $amount) {\n        if ($type === 'credit_card') {\n            // Processamento de cartão de crédito\n        } elseif ($type === 'paypal') {\n            // Processamento PayPal\n        } elseif ($type === 'bitcoin') {\n            // Processamento Bitcoin\n        }\n        // Cada novo tipo de pagamento exige alteração neste método!\n    }\n}\n?>
\n\n

Exemplo bom (cumprimento do OCP)

\n
<?php\ninterface PaymentMethod {\n    public function process(float $amount): bool;\n}\n\nclass CreditCardPayment implements PaymentMethod {\n    public function process(float $amount): bool {\n        // Lógica de pagamento com cartão de crédito\n        echo "Pagamento com cartão: $amount\\n";\n        return true;\n    }\n}\n\nclass PayPalPayment implements PaymentMethod {\n    public function process(float $amount): bool {\n        // Lógica de pagamento via PayPal\n        echo "Pagamento PayPal: $amount\\n";\n        return true;\n    }\n}\n\nclass BitcoinPayment implements PaymentMethod {\n    public function process(float $amount): b                

Blogs

Book Recommendations