Padrões de Projeto em PHP em Nível Avançado: 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

Padrões de Projeto em PHP: Nível Avançado

\n\n

Padrões de projeto (design patterns) são soluções comprovadas para problemas típicos que surgem no desenvolvimento de software. No nível iniciante, os desenvolvedores estudam Singleton, Factory ou Adapter. No entanto, em sistemas complexos, de alta carga ou flexíveis em PHP, são necessários padrões mais poderosos e abstratos. Neste artigo, abordaremos quatro padrões avançados com exemplos reais de código em PHP: Strategy, Factory Method, Observer e State.

\n\n

1. Padrão "Strategy" (Estratégia)

\n\n

Objetivo: Define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis. Permite alterar o comportamento do objeto em tempo de execução sem modificar seu código.

\n\n

Exemplo: Sistema de processamento de pagamentos. Temos várias formas de pagamento: cartão de crédito, PayPal, criptomoeda. Cada forma tem sua própria lógica de validação e processamento.

\n\n
<?php\n\n// Interface da estratégia\ninterface PaymentStrategy\n{\n    public function pay(float $amount): void;\n    public function validate(): bool;\n}\n\n// Estratégias concretas\nclass CreditCardPayment implements PaymentStrategy\n{\n    private string $cardNumber;\n    private string $cvv;\n\n    public function __construct(string $cardNumber, string $cvv)\n    {\n        $this->cardNumber = $cardNumber;\n        $this->cvv = $cvv;\n    }\n\n    public function validate(): bool\n    {\n        // Verificação simples do comprimento do número do cartão\n        return strlen($this->cardNumber) === 16 && strlen($this->cvv) === 3;\n    }\n\n    public function pay(float $amount): void\n    {\n        if (!$this->validate()) {\n            throw new \\InvalidArgumentException("Dados do cartão inválidos");\n        }\n        echo "Pago {$amount} via cartão de crédito {$this->cardNumber}.<br>";\n    }\n}\n\nclass PayPalPayment implements PaymentStrategy\n{\n    private string $email;\n\n    public function __construct(string $email)\n    {\n        $this->email = $email;\n    }\n\n    public function validate(): bool\n    {\n        return filter_var($this->email, FILTER_VALIDATE_EMAIL) !== false;\n    }\n\n    public function pay(float $amount): void\n    {\n        if (!$this->validate()) {\n            throw new \\InvalidArgumentException("Email PayPal inválido");\n        }\n        echo "Pago {$amount} via PayPal ({$this->email}).<br>";\n    }\n}\n\n// Contexto (cliente)\nclass OrderProcessor\n{\n    private PaymentStrategy $strategy;\n\n    public function setPaymentStrategy(PaymentStrategy $strategy): void\n    {\n        $this->strategy = $strategy;\n    }\n\n    public function processOrder(float $total): void\n    {\n        if (!isset($this->strategy)) {\n            throw new \\RuntimeException("Método de pagamento não selecionado");\n        }\n        $this->strategy->pay($total);\n    }\n}\n\n// Uso\n$order = new OrderProcessor();\n$order->setPaymentStrategy(new CreditCardPayment('1234567812345678', '123'));\n$order->processOrder(150.00);\n// Saída: Pago 150 via cartão de crédito 1234567812345678.\n\n?>
\n\n

Vantagens: Facilidade para adicionar novos algoritmos (novas formas de pagamento) sem alterar o código existente. O código se torna flexível e testável.

\n\n

2. Padrão "Factory Method" (Método Fábrica)

\n\n

Objetivo: Define uma interface para criar um objeto, mas permite que as subclasses alterem o tipo do objeto criado. Este é o padrão base para todos os padrões criacionais.

\n\n

Exemplo: Geração de diferentes tipos de relatórios (PDF, HTML, JSON) dependendo da solicitação do usuário.

\n\n
<?php\n\n// Produto abstrato\ninterface Report\n{\n    public function generate(): string;\n}\n\n// Produtos concretos\nclass PdfReport implements Report\n                

Blogs

Book Recommendations