Injeção de Dependência em PHP: um guia simples 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

Injeção de Dependência em PHP: para iniciantes



Imagine que você está montando um computador. Você não solda o processador diretamente na placa-mãe para sempre — você o insere em um soquete especial, para que possa substituí-lo por um mais potente quando necessário. Injeção de Dependência (DI) em PHP funciona pelo mesmo princípio: em vez de criar dependências dentro da classe, você as "injeta" de fora.



Neste artigo, vamos explicar o que é Injeção de Dependência, por que ela é necessária e como aplicá-la em PHP. Você aprenderá como tornar seu código flexível, testável e fácil de manter.



O que é Injeção de Dependência em palavras simples



Injeção de Dependência é um padrão de projeto no qual um objeto recebe suas dependências (outros objetos, serviços) de fora, em vez de criá-las ele mesmo. Em vez de escrever new Database() dentro da classe, você passa um objeto de banco de dados já pronto através do construtor ou de um setter.



Vamos analisar o problema que a DI resolve. Considere a classe UserService, que cria diretamente uma conexão com o banco de dados:



<?phpclass UserService {    private $db;        public function __construct() {        // Acoplamento rígido com uma implementação específica        $this->db = new MySQLConnection('localhost', 'user', 'pass');    }        public function getUser($id) {        return $this->db->query("SELECT * FROM users WHERE id = $id");    }}?>


Os problemas dessa abordagem são óbvios:



  • Acoplamento rígido (tight coupling) — a classe UserService está vinculada a MySQLConnection. Para migrar para PostgreSQL, será necessário alterar o código da classe.
  • Dificuldade de teste — você não conseguirá substituir o banco de dados por um objeto mock em testes unitários.
  • Violação do princípio da responsabilidade única — a classe não só lida com usuários, mas também cria a conexão com o banco de dados.


Agora, reescrevemos esta classe usando Injeção de Dependência:



<?phpinterface DatabaseInterface {    public function query($sql);}

class MySQLConnection implements DatabaseInterface { public function query($sql) { // Implementação para MySQL }}

class PostgreSQLConnection implements DatabaseInterface { public function query($sql) { // Implementação para PostgreSQL }}

class UserService { private $db; // A dependência é injetada através do construtor public function __construct(DatabaseInterface $db) { $this->db = $db; } public function getUser($id) { return $this->db->query("SELECT * FROM users WHERE id = $id"); }}

// Uso$db = new MySQLConnection('localhost', 'user', 'pass');$userService = new UserService($db);?>


Agora, UserService não sabe com qual banco de dados específico está trabalhando. Ele simplesmente usa a interface DatabaseInterface. Essa é a essência da Injeção de Dependência.



Três tipos principais de injeção de dependências



Em PHP, existem três maneiras principais de injetar dependências. Vamos analisar cada uma delas.



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



Esta é a maneira mais comum e recomendada. As dependências são passadas através dos parâmetros do construtor e armazenadas em propriedades privadas da classe.



<?phpclass Logger {    private $writer;        public function __construct(LogWriterInterface $writer) {        $this->writer = $writer;    }        public function log($message) {        $this->writer->write($message);    }}?>


Vantagens: as dependências são claramente visíveis, o objeto está sempre em um estado válido (todas as dependências são obrigatórias).



Desvantagens: e

Blogs

Book Recommendations