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
namespacedefine o espaço de nomes;useimporta 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.
<?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);