Padrões de projeto em PHP: exemplos e aplicação prática

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

O que são padrões de projeto e por que são necessários em PHP?



Padrões de projeto (design patterns) são soluções comprovadas para problemas típicos que surgem no desenvolvimento de software. Eles não são código pronto, mas sim modelos que podem ser adaptados a uma situação específica. Para um desenvolvedor PHP, conhecer padrões ajuda a escrever código mais flexível, sustentável e escalável.



Neste artigo, vamos analisar quatro padrões básicos do catálogo GoF (Gang of Four) que são mais frequentemente usados em projetos reais em PHP. Cada padrão será acompanhado de um exemplo prático e explicações.



1. Singleton



O padrão Singleton garante que uma classe tenha apenas uma instância e fornece um ponto de acesso global a ela. Isso é útil para gerenciar conexões de banco de dados, loggers ou cache.



Quando aplicar?

  • É necessário exatamente um objeto (por exemplo, uma conexão com o banco de dados).
  • O objeto é usado em toda a aplicação e a criação de duplicatas não é permitida.


Exemplo de implementação:

<?phpclass DatabaseConnection{    private static ?self $instance = null;    private PDO $pdo;

private function __construct() { $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); }

public static function getInstance(): self { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }

public function getConnection(): PDO { return $this->pdo; }

// Proibindo clonagem e desserialização private function __clone() {} public function __wakeup() { throw new \\Exception("Cannot unserialize singleton"); }}

// Uso:$db = DatabaseConnection::getInstance();$pdo = $db->getConnection();?>


Importante: O Singleton é frequentemente criticado por violar o princípio da responsabilidade única e dificultar os testes. Use-o conscientemente e apenas onde for realmente necessário.



2. Factory Method



O padrão Factory Method define uma interface para criar um objeto, mas permite que as subclasses alterem o tipo do objeto criado. Isso permite delegar a lógica de criação de objetos para classes filhas.



Quando aplicar?

  • Não se sabe antecipadamente qual objeto específico será necessário criar.
  • Deseja-se ocultar a lógica complexa de criação do objeto do cliente.


Exemplo de implementação:

<?php// Interface para todos os tipos de notificaçãointerface Notification{    public function send(string $message): void;}

// Implementações concretasclass EmailNotification implements Notification{ public function send(string $message): void { echo "Enviando email: {$message}"; }}

class SMSNotification implements Notification{ public function send(string $message): void { echo "Enviando SMS: {$message}"; }}

// Criador abstratoabstract class NotificationFactory{ abstract public function createNotification(): Notification;

public function notify(string $message): void { $notification = $this->createNotification(); $notification->send($message); }}

// Fábricas concretasclass EmailFactory extends NotificationFactory{ public function createNotification(): Notification { return new EmailNotification(); }}

class SMSFactory extends NotificationFactory{ public function createNotification(): Notification { return new SMSNotification(); }}

// Uso:$factory = new EmailFactory();$factory->notify("Seu pedido foi confirmado!");

$factory = new SMSFactory();$factory->notify("Código de confirmação: 1234");

Blogs

Book Recommendations