Injeção de Dependência (Dependency Injection) em PHP para iniciantes

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 é Dependency Injection em PHP e por que é necessário?

\n\n

Imagine que você está construindo uma casa. Em vez de fazer cada tijolo você mesmo, você simplesmente os encomenda e usa os prontos. Dependency Injection (DI) na programação funciona pelo mesmo princípio — você não cria objetos dentro da classe, mas os recebe de fora. Isso torna seu código flexível, testável e compreensível.

\n\n

Em PHP, como em qualquer linguagem orientada a objetos, as classes frequentemente dependem de outras classes. O problema surge quando as dependências são criadas diretamente dentro da classe — isso é chamado de acoplamento rígido (tight coupling). O Dependency Injection resolve esse problema passando as dependências de fora.

\n\n

Problema sem Dependency Injection

\n

Vamos considerar um exemplo típico onde a classe UserService cria ela mesma o objeto do banco de dados:

\n\n
<?php\nclass Database {\n    public function query($sql) {\n        // Lógica da consulta\n        return "Resultado: " . $sql;\n    }\n}\n\nclass UserService {\n    private $db;\n    \n    public function __construct() {\n        // Acoplamento rígido — a classe cria a dependência\n        $this->db = new Database();\n    }\n    \n    public function getUser($id) {\n        return $this->db->query("SELECT * FROM users WHERE id = $id");\n    }\n}\n\n$service = new UserService();\necho $service->getUser(1);\n?>
\n\n

Problemas dessa abordagem:

\n
    \n
  • Não é possível substituir Database por outra implementação (por exemplo, para testes)
  • \n
  • Difícil de testar — não é possível usar um mock (simulação)
  • \n
  • O código se torna monolítico e difícil de estender
  • \n
\n\n

Solução: Injeção de dependência via construtor

\n

Agora vamos reescrever a mesma classe usando Dependency Injection:

\n\n
<?php\nclass UserService {\n    private $db;\n    \n    // A dependência é passada de fora\n    public function __construct(Database $db) {\n        $this->db = $db;\n    }\n    \n    public function getUser($id) {\n        return $this->db->query("SELECT * FROM users WHERE id = $id");\n    }\n}\n\n// Criamos a dependência separadamente\n$database = new Database();\n$service = new UserService($database);\necho $service->getUser(1);\n?>
\n\n

Agora UserService não sabe como Database é criado. Ele simplesmente usa o que foi passado para ele. Isso é injeção de dependência.

\n\n

Tipos de Dependency Injection em PHP

\n

Existem três formas principais de injetar dependências. Vamos ver cada uma com exemplos.

\n\n

1. Injeção via construtor (Constructor Injection)

\n

A forma mais comum e recomendada. As dependências são passadas na criação do objeto através do construtor.

\n\n
<?php\nclass Logger {\n    public function log($message) {\n        echo "[LOG]: " . $message;\n    }\n}\n\nclass OrderProcessor {\n    private $logger;\n    \n    // Dependência no construtor\n    public function __construct(Logger $logger) {\n        $this->logger = $logger;\n    }\n    \n    public function process($order) {\n        // Processamento do pedido\n        $this->logger->log("Pedido processado: " . $order);\n    }\n}\n\n$logger = new Logger();\n$processor = new OrderProcessor($logger);\n$processor->process("Pedido #123");\n?>
\n\n

Vantagens: a dependência está sempre disponível, o objeto está sempre em estado válido. Desvantagens: se houver muitas dependências, o construtor pode se tornar extenso.

\n\n

2. Injeção via setter (Setter Injection)

\n

Usada quando a dependência pode ser opcional ou precisa ser alterada durante a execução do objeto.

\n\n
<?php\nclass MailService {\n    private $transport;\n    \n    // Setter para a dependência\n    public function setTransport($transport) {\n        $this->transport = $transport;\n    }\n    \n    public function send($to, $mess                

Blogs

Book Recommendations