Padrões de Projeto em PHP: do Básico às Técnicas Avançadas
Padrões de projeto (design patterns) são soluções repetidamente testadas para problemas típicos que surgem no desenvolvimento de software. Para o desenvolvedor PHP, conhecer padrões não é apenas um item no currículo, mas uma ferramenta real para criar código flexível, sustentável e escalável. Neste artigo, abordaremos três grupos principais de padrões GoF (Gang of Four) com exemplos concretos em PHP que você poderá aplicar imediatamente em seus projetos.
1. Padrões Criacionais (Creational Patterns)
Esses padrões são responsáveis pela criação de objetos, ocultando a lógica de instanciação e tornando o sistema independente da forma como os objetos são criados e compostos.
Singleton (Instância Única)
Garante que uma classe tenha apenas uma instância e fornece um ponto de acesso global a ela. Exemplo clássico: conexão com banco de dados.
<?phpclass Database { private static ?Database $instance = null; private PDO $pdo;
private function __construct() { $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); }
public static function getInstance(): Database { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }
public function query(string $sql): array { // Lógica de execução da consulta return $this->pdo->query($sql)->fetchAll(); }
// Proíbe clonagem e desserialização private function __clone() {} public function __wakeup() { throw new Exception("Cannot unserialize singleton"); }}
// Uso$db = Database::getInstance();$results = $db->query("SELECT * FROM users");?>Factory Method (Método Fábrica)
Define uma interface para criar um objeto, mas permite que subclasses alterem o tipo do objeto criado. Ideal para criar famílias de objetos relacionados.
<?phpinterface Logger { public function log(string $message): void;}
class FileLogger implements Logger { public function log(string $message): void { file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND); }}
class DatabaseLogger implements Logger { public function log(string $message): void { // Salva no BD echo "Logged to DB: $message"; }}
abstract class LoggerFactory { abstract public function createLogger(): Logger;
public function logMessage(string $message): void { $logger = $this->createLogger(); $logger->log($message); }}
class FileLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new FileLogger(); }}
class DatabaseLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new DatabaseLogger(); }}
// Uso$factory = new FileLoggerFactory();$factory->logMessage("Esta mensagem será gravada no arquivo");?>2. Padrões Estruturais (Structural Patterns)
Eles definem como classes e objetos podem ser combinados em estruturas maiores, mantendo flexibilidade e eficiência.
Adapter (Adaptador)
Permite que objetos com interfaces incompatíveis trabalhem juntos. O adaptador atua como um invólucro que converte chamadas de uma interface para outra.
<?php// Classe antiga com interface inconvenienteclass OldPaymentSystem { public function processPayment(float $amount, string $currency): string { return "Processing $amount $currency via legacy system"; }}
// Nova interface que queremos usarinterface NewPaymentInterface { public function pay(float $amount): string;}
// Adaptadorclass PaymentAdapter implements NewPayme