Autoloader do Composer
Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 13 de 91.
Escrever seu próprio autoloader funciona, mas projetos PHP reais usam o Composer para lidar automaticamente com o carregamento automático. O Composer lê a configuração do seu projeto e gera um autoloader otimizado que segue os padrões PSR-4.
A configuração fica em um arquivo composer.json na raiz do seu projeto. Veja como definir as regras de carregamento automático:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Isso informa ao Composer que qualquer classe que comece com App\ deve ser carregada do diretório src/. Depois de configurar isso, o Composer gera os arquivos do autoloader em um diretório vendor/.
Para usar o autoloader do Composer, você só precisa de uma linha no início do seu arquivo de entrada:
<?php
require 'vendor/autoload.php';
use App\Models\User;
use App\Services\Logger;
$user = new User("Alice");
$logger = new Logger();
Essa única instrução require cuida do carregamento de todas as classes de todo o seu projeto. Você pode definir vários mapeamentos de namespace, se necessário:
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Tests\\": "tests/"
}
}
}Ponto principal: O autoloader do Composer elimina as inclusões manuais de arquivos e garante o carregamento consistente de classes em todo o seu projeto. Essa é a abordagem padrão usada por praticamente todas as aplicações e frameworks modernos em PHP.
Desafio
FácilVamos criar uma pequena aplicação que usa a abordagem de carregamento automático do Composer para organizar classes em vários arquivos. Você simulará como um projeto PHP real estrutura seu código com namespaces PSR-4 e um autoloader central.
Você criará quatro arquivos que trabalham em conjunto:
src/Models/Product.php: Defina uma classeProductno namespaceApp\Models. Ela deve ter as propriedadespublic $nameepublic $price, um construtor que aceite e defina ambos os valores e um métodogetInfo()que retorne"[name]: $[price]".src/Models/Customer.php: Defina uma classeCustomerno namespaceApp\Models. Ela deve ter uma propriedadepublic $name, um construtor que aceite e defina o nome e um métodogreet()que retorne"Welcome, [name]!".vendor/autoload.php: Crie um autoloader simples usandospl_autoload_registerque imite o comportamento do Composer. Ele deve mapear o prefixo de namespaceApp\para o diretóriosrc/, convertendo os separadores de namespace em separadores de diretório e adicionando.phppara carregar o arquivo correto.index.php: Este é o arquivo de entrada. Requeira o autoloader devendor/autoload.phpcom uma única linha e, em seguida, use a palavra-chaveusepara importarApp\Models\ProducteApp\Models\Customer. Crie umProductcom o nome"Laptop"e o preço999, e umCustomercom o nome"Alice". Imprima o resultado da chamada degreet()no cliente e degetInfo()no produto (cada um em sua própria linha).
O conceito principal aqui é que seu index.php precisa apenas de uma instrução require para carregar o autoloader; depois disso, todas as classes são carregadas automaticamente quando você as utiliza. É exatamente assim que os frameworks e as aplicações PHP modernos funcionam com o Composer.
Experimente você mesmo
<?php
// TODO: Requeira o autoloader de vendor/autoload.php
// TODO: Use a palavra-chave 'use' para importar App\Models\Product
// TODO: Use a palavra-chave 'use' para importar App\Models\Customer
// TODO: Crie um Product com nome "Laptop" e preço 999
// TODO: Crie um Customer com nome "Alice"
// TODO: Imprima o resultado de greet() do customer
// TODO: Imprima o resultado de getInfo() do product
?>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
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online