Introdução: por que SOLID é a base do código PHP de qualidade
\n\nTodo 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\nNeste 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\n1. Single Responsibility Principle (SRP) — Princípio da Responsabilidade Única
\n\nEssência do princípio
\nUma 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\nExemplo 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?>\nAqui, 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.
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?>\nAgora cada classe tem uma única responsabilidade, e alterar a forma de salvamento não afetará o envio de email.
\n\n2. Open/Closed Principle (OCP) — Princípio Aberto/Fechado
\n\nEssência do princípio
\nEntidades 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\nExemplo 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\nExemplo 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