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.

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

A regra principal é simples: o namespace deve corresponder à estrutura de diretórios. Se você tem uma classe App\Models\User, o arquivo deve 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 de autoloader simples que segue 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: O PSR-4 cria um mapeamento previsível entre namespaces e caminhos de arquivo. Quando você vê App\Models\User, você sabe imediatamente que o arquivo está em src/Models/User.php. Esta convenção torna os projetos mais fáceis de navegar e manter.

challenge icon

Desafio

Fácil

Vamos construir um sistema simples de autoloading PSR-4 que carrega classes automaticamente com base em seu namespace e localização de arquivo.

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

  • src/Services/Logger.php — Defina uma classe Logger no namespace App\Services. Ela deve ter uma propriedade public $name, um construtor que aceita e define o nome, e um método log($message) que retorna "[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 aceita e define o remetente, e um método send($to) que retorna "Mail from [sender] to [to]".
  • main.php — Crie um autoloader PSR-4 usando spl_autoload_register que mapeia o prefixo de namespace App\ para o diretório src/. O autoloader deve converter separadores de namespace em separadores de diretório e anexar .php para encontrar o arquivo correto. Após registrar o autoloader, use a palavra-chave use para importar ambas as classes, então 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 send("user@example.com") no mailer (cada um em sua própria linha).

O ponto principal é que sua função de autoloader recebe o nome completo da classe (como App\Services\Logger) e deve convertê-lo em um caminho de arquivo (src/Services/Logger.php). Use strpos para verificar se a classe começa com o seu prefixo de namespace, substr para obter o nome relativo da classe e str_replace para converter barras invertidas em barras normais.

Folha de consulta

PSR-4 é um padrão que define como as classes PHP devem ser carregadas automaticamente com base em seu namespace e localização de arquivo. O namespace deve corresponder à estrutura de diretórios.

Exemplo de estrutura de classe:

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

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

Autoloader PSR-4 usando spl_autoload_register:

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

O autoloader converte separadores de namespace (\) em separadores de diretório (/) e anexa .php para encontrar o arquivo correto. Por exemplo, App\Models\User mapeia para src/Models/User.php.

Experimente você mesmo

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

// TODO: Registrar um autoloader usando spl_autoload_register
// O autoloader deve:
// 1. Verificar se a classe começa com o prefixo de namespace 'App\'
// 2. Remover o prefixo 'App\' para obter o nome relativo da classe
// 3. Converter separadores de namespace (\) em separadores de diretório (/)
// 4. Prefixar 'src/' e sufixar '.php' para construir o caminho do arquivo
// 5. Requerer o arquivo se ele existir

spl_autoload_register(function ($class) {
    // TODO: Definir o prefixo do namespace e o diretório base
    
    // TODO: Verificar se a classe usa o prefixo do namespace (use strpos)
    
    // TODO: Obter o nome relativo da classe (use substr)
    
    // TODO: Construir o caminho do arquivo substituindo \ por / (use str_replace)
    
    // TODO: Requerer o arquivo se ele existir
});

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

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

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

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

// TODO: Imprimir 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