Da trilha de PHP Este conceito ainda não saiu como card do dia. ir para o card de hoje

PHP Módulos Intermediário

Namespaces e autoload

Em PHP, namespaces servem para organizar o código e evitar conflitos de nomes entre classes, funções e constantes. Eles funcionam como pastas virtuais: App\Models\User é diferente de Outro\Models\User. Para usar uma classe de outro namespace, você pode importá-la com use ou referenciá-la pelo nome completo.

O autoload do Composer segue o padrão PSR-4, que mapeia namespaces para diretórios. Assim, quando você tenta usar uma classe ainda não carregada, o Composer converte o namespace em um caminho de arquivo e o inclui automaticamente. Isso elimina a necessidade de vários require manuais.

Para configurar, basta declarar no composer.json a seção autoload com psr-4 e rodar composer dump-autoload. A organização típica é: src/ para o código-fonte, com subpastas espelhando os namespaces.

Pontos-chave

  • namespace define o espaço de nomes; use importa nomes para o escopo atual.
  • PSR-4 mapeia prefixos de namespace para diretórios: App\ → src/.
  • O autoload do Composer carrega classes automaticamente seguindo PSR-4.
  • A estrutura de pastas deve espelhar o namespace após o prefixo.
autoload_psr4.php
<?php
// Exemplo de autoload PSR-4 manual (sem Composer)
// Estrutura de pastas:
// src/
//   Models/
//     User.php
//   Services/
//     UserService.php

// Simulando o autoloader do Composer para o prefixo App\
spl_autoload_register(function ($class) {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';

    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        return; // não é do nosso namespace
    }

    $relativeClass = substr($class, $len);
    $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';

    if (file_exists($file)) {
        require $file;
    }
});

// Agora podemos usar as classes sem require manual
use App\Models\User;
use App\Services\UserService;

$user = new User('Ana');
$service = new UserService();
echo $service->greet($user);

Exercícios

  1. 1
    Fácil

    Criando e usando namespaces

    Crie duas classes em namespaces diferentes: App\Models\Product e App\Services\ProductService. A classe Product deve ter um construtor que recebe $name e um método getName(). A classe ProductService deve ter um método describe(Product $product) que retorna "Produto: " . $product->getName(). No arquivo principal, instancie as duas e exiba o resultado.

    Resolver
  2. 2
    Médio

    Autoload PSR-4 manual

    Implemente um autoloader que siga o padrão PSR-4 para o prefixo App\ mapeado para o diretório src/. Crie as classes App\Models\User (com getName()) e App\Services\UserService (com greet(User $user) retornando "Olá, " . $user->getName()). O autoloader deve carregar automaticamente os arquivos quando as classes forem usadas. No arquivo principal, registre o autoloader, instancie as classes e exiba a saudação.

    Resolver
  3. 3
    Desafio

    Organização com Composer e PSR-4

    Configure um projeto Composer com autoload PSR-4 para o namespace App\ apontando para src/. Crie as classes App\Models\Product, App\Repositories\ProductRepository e App\Services\ProductService. O ProductRepository deve armazenar produtos em um array e ter métodos add(Product $product) e all(): array. O ProductService deve receber o repositório no construtor e ter um método listNames(): array que retorna os nomes dos produtos. No arquivo principal, instancie tudo, adicione dois produtos e exiba a lista de nomes separados por vírgula.

    Resolver

Continue estudando