Aikido

Como corrigir erros de carregamento automático do PHP: correspondência entre nomes de classes e nomes de ficheiros

Risco de insectos

Regra
Classe nome deve corresponder ao nome do ficheiro.
Muitas idiomas requerem classe nomes
para coincidam nomes de ficheiros exatamente, ou eles irão
falhar em sensíveis a maiúsculas e minúsculas sistemas de ficheiros (Linux).

Linguagens suportadas: PHP

Introdução

O carregamento automático PSR-4 do PHP requer que os nomes das classes correspondam exatamente aos nomes dos ficheiros, incluindo maiúsculas e minúsculas. Uma classe chamada Repositório de utilizadores deve estar em UserRepository.php, não userrepository.php. Isto funciona em sistemas de ficheiros que não fazem distinção entre maiúsculas e minúsculas, como o Windows e o macOS, mas falha nos servidores Linux, causando erros de "Classe não encontrada" na produção.

Porque é importante

Falhas na produção: Nomes incompatíveis causam falhas de carregamento automático em servidores Linux onde os sistemas de ficheiros são sensíveis a maiúsculas e minúsculas. O código que funciona localmente quebra na produção, exigindo hotfixes de emergência e causando tempo de inatividade.

Conformidade com o PSR-4: As estruturas PHP modernas dependem do carregamento automático PSR-4. Classes que não seguem as convenções de nomenclatura não podem ser carregadas automaticamente, quebrando a injeção de dependência, contêineres de serviço e recursos da estrutura.

Exemplos de código

Não conforme:

<?php
// File: userrepository.php

namespace App\Repositories;

class UserRepository
{
    public function findById($id)
    {
        return User::find($id);
    }

    public function save(User $user)
    {
        return $user->save();
    }
}

Porque é que é errado: O nome da classe é Repositório de utilizadores mas o nome do ficheiro é userrepository.php (minúsculas). O carregador automático PSR-4 procurará UserRepository.php e não o encontrar em sistemas de ficheiros Linux sensíveis a maiúsculas e minúsculas, causando erros fatais na produção.

Conformidade:

<?php
// File: UserRepository.php

namespace App\Repositories;

class UserRepository
{
    public function findById($id)
    {
        return User::find($id);
    }

    public function save(User $user)
    {
        return $user->save();
    }
}

Porque é que isto é importante: O nome do ficheiro UserRepository.php corresponde ao nome da classe Repositório de utilizadores exatamente, incluindo o caso. O carregador automático PSR-4 pode localizar e carregar a classe de forma fiável em qualquer sistema de ficheiros, eliminando falhas específicas do ambiente e garantindo um comportamento consistente no desenvolvimento e na produção.

Conclusão

Imponha uma correspondência rigorosa entre nome de arquivo e nome de classe desde o início do seu projeto. Configure seu IDE para nomear automaticamente os arquivos corretamente ao criar classes. Use verificações automatizadas em pipelines de CI/CD para detetar incompatibilidades antes da implantação. Os cinco minutos gastos para garantir a nomeação correta evitam horas de depuração de falhas de carregamento automático de produção.

FAQs

Tem perguntas?

Porque é que isto funciona no Windows/macOS mas falha no Linux?

O Windows e o macOS usam sistemas de arquivos que não diferenciam maiúsculas de minúsculas por padrão (NTFS, APFS, HFS+). Quando o carregador automático do PHP solicita UserRepository.php, esses sistemas retornarão userrepository.php porque tratam os nomes de arquivo como não diferenciando maiúsculas de minúsculas. O Linux utiliza sistemas de ficheiros sensíveis a maiúsculas e minúsculas (ext4, xfs) onde UserRepository.php e userrepository.php são ficheiros completamente diferentes. O carregador automático falha porque procura uma correspondência exacta.

Como é que encontro todas as incompatibilidades entre classes e nomes de ficheiros na minha base de código?

Escreva um script que analise arquivos PHP, extraia nomes de classes usando reflexão ou regex e compare-os com nomes de arquivos. Muitas ferramentas de análise estática detectam violações de PSR-4. Em CI/CD, execute a validação do autoloader do Composer com composer dump-autoload --optimize --strict-psr. Isso captura incompatibilidades antes da implantação. Alguns IDEs, como o PhpStorm, destacam as violações da PSR-4 durante o desenvolvimento.

E quanto a traços, interfaces e classes abstractas?

A mesma regra se aplica. Uma interface denominada UserRepositoryInterface deve estar em UserRepositoryInterface.php. Uma caraterística chamada Timestampable requer Timestampable.php. As classes abstractas seguem o mesmo padrão. O PSR-4 trata todas as estruturas semelhantes a classes de forma idêntica. O nome do arquivo deve corresponder exatamente ao nome da classe/trait/interface, incluindo maiúsculas e minúsculas.

Posso utilizar sublinhados ou hífenes nos nomes dos ficheiros?

Não para conformidade com a PSR-4. Os nomes de classes PHP não podem conter hífenes ou a maioria dos caracteres especiais. Underscores são tecnicamente permitidos em nomes de classes mas desencorajados pelos padrões PSR. Use PascalCase tanto para nomes de classes quanto para nomes de arquivos: UserRepository, não User_Repository ou user-repository. A consistência com as convenções PSR-4 garante a compatibilidade com o framework.

E se eu tiver várias turmas num ficheiro?

Não o faça. O PSR-4 requer uma classe por ficheiro com nomes correspondentes. Várias classes num único ficheiro quebram o carregamento automático porque o carregador automático espera uma relação 1:1 entre os nomes das classes e os caminhos dos ficheiros. Se tiver classes fortemente acopladas, considere se devem ser classes internas, ficheiros separados, ou refactoradas numa única classe coesa. Uma classe por ficheiro é um requisito fundamental da PSR-4.

Como é que trato o código antigo que viola esta regra?

Corrija todas as incompatibilidades antes de implantar em servidores Linux, pois arquivos incompatíveis causarão falhas de carregamento automático imediatas na produção. Use ferramentas de refatoração do IDE que renomeiam a classe e o arquivo simultaneamente. No macOS, as renomeações somente para maiúsculas e minúsculas podem exigir dois commits do git: primeiro renomeie para um nome temporário (UserRepository_temp.php), faça o commit e, em seguida, renomeie para o caso correto (UserRepository.php). Para grandes bases de código, corrija todas as violações em um PR dedicado, teste completamente e, em seguida, implante. Atualize o autoloader do Composer (composer dump-autoload) após renomear os arquivos.

O namespace afecta o nome do ficheiro?

O espaço de nome afeta a estrutura do diretório, não o nome do arquivo em si. Uma classe App\\Repositories\\UserRepository deve estar em app/Repositories/UserRepository.php (ou src/Repositories/UserRepository.php dependendo da sua raiz PSR-4). O namespace mapeia para diretórios, e o nome da classe mapeia para o nome do ficheiro. Ambos devem seguir as convenções da PSR-4: os segmentos do espaço de nomes mapeiam para diretórios com maiúsculas e minúsculas, o nome da classe mapeia para o nome do ficheiro com maiúsculas e minúsculas.

Obter segurança gratuitamente

Proteja seu código, nuvem e tempo de execução em um sistema central.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados do scan em 32secs.