Menu
Coddy logo textTech

Padrão de Autoloading PSR-4

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 12 de 91.

PSR-4 é um padrão que define como as classes PHP devem ser carregadas automaticamente com base em seu namespace e na localização do arquivo. Em vez de incluir manualmente o arquivo de cada classe, o PSR-4 permite que o PHP encontre e carregue as classes automaticamente quando você as utiliza.

A regra fundamental é simples: o namespace deve corresponder à estrutura de diretórios. Se você tiver uma classe App\Models\User, o arquivo deverá estar localizado em App/Models/User.php.

<?php
// Arquivo: src/Models/User.php
namespace App\Models;

class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

Você pode escrever uma função simples de carregamento automático que siga as regras da PSR-4:

<?php
// Arquivo: autoload.php
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';
    
    // Verifica se a classe usa o prefixo do nosso namespace
    if (strpos($class, $prefix) === 0) {
        $relativeClass = substr($class, strlen($prefix));
        $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
        
        if (file_exists($file)) {
            require $file;
        }
    }
});

A função spl_autoload_register informa ao PHP para chamar sua função sempre que encontrar uma classe desconhecida. A função converte o namespace em um caminho de arquivo e o carrega.

Ponto-chave: PSR-4 cria um mapeamento previsível entre namespaces e caminhos de arquivos. Quando você vê App\Models\User, sabe imediatamente que o arquivo está em src/Models/User.php. Essa convenção torna os projetos mais fáceis de navegar e manter.

challenge icon

Desafio

Fácil

Vamos criar um sistema simples de carregamento automático PSR-4 que carregue classes automaticamente com base em seu namespace e na localização do arquivo.

Você criará um projeto com três arquivos que demonstram como o PSR-4 mapeia namespaces para caminhos de diretórios:

  • src/Services/Logger.php: Defina uma classe Logger no namespace App\Services. Ela deve ter uma propriedade public $name, um construtor que aceite e defina o nome e um método log($message) que retorne "[name] logged: [message]".
  • src/Services/Mailer.php: Defina uma classe Mailer no namespace App\Services. Ela deve ter uma propriedade public $sender, um construtor que aceite e defina o remetente e um método send($to) que retorne "Mail from [sender] to [to]".
  • main.php: Crie um carregador automático PSR-4 usando spl_autoload_register que mapeie o prefixo de namespace App\ para o diretório src/. O carregador automático deve converter os separadores de namespace em separadores de diretório e acrescentar .php para encontrar o arquivo correto. Depois de registrar o carregador automático, use a palavra-chave use para importar ambas as classes; em seguida, crie um Logger com o nome "FileLogger" e um Mailer com o remetente "admin@site.com". Imprima o resultado da chamada de log("System started") no logger e de send("user@example.com") no mailer (cada um em sua própria linha).

A ideia principal é que sua função de carregamento automático receba o nome totalmente qualificado da classe (como App\Services\Logger) e precise convertê-lo em um caminho de arquivo (src/Services/Logger.php). Use strpos para verificar se a classe começa com o prefixo do namespace, substr para obter o nome relativo da classe e str_replace para converter barras invertidas em barras normais.

Experimente você mesmo

<?php
// Implementação de Autoloader PSR-4

// TODO: Registre um autoloader usando spl_autoload_register
// O autoloader deve:
// 1. Verifique se a classe começa com o prefixo de namespace 'App\'
// 2. Remova o prefixo 'App\' para obter o nome relativo da classe
// 3. Converta os separadores de namespace (\) em separadores de diretório (/)
// 4. Anteponha 'src/' e acrescente '.php' para construir o caminho do arquivo
// 5. Faça o require do arquivo se ele existir

spl_autoload_register(function ($class) {
    // TODO: Defina o prefixo do namespace e o diretório base
    
    // TODO: Verifique se a classe usa o prefixo do namespace (use strpos)
    
    // TODO: Obtenha o nome relativo da classe (use substr)
    
    // TODO: Construa o caminho do arquivo substituindo \ por / (use str_replace)
    
    // TODO: Faça o require do arquivo se ele existir
});

// TODO: Use a palavra-chave 'use' para importar as classes Logger e Mailer

// TODO: Crie uma instância de Logger com o nome "FileLogger"

// TODO: Crie uma instância de Mailer com o remetente "admin@site.com"

// TODO: Imprima o resultado de log("System started")

// TODO: Imprima o resultado de send("user@example.com")
?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de PHP online