Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida referente ao uso de \\ no mapeamento do autoload PSR-4

Estava lendo a documentação do composer, e não consegui compreender esse seguinte parágrafo

Namespace prefixes must end in \ to avoid conflicts between similar prefixes. For example Foo would match classes in the FooBar namespace so the trailing backslashes solve the problem: Foo\ and FooBar\ are distinct. https://getcomposer.org/doc/04-schema.md#autoload:~:text=Namespace%20prefixes%20must,are%20distinct.

Até tentem montar um exemplo mas não consegui replicar, poderiam me auxiliar?

<?php
namespace Foo;

class Bar
{
    public function teste()
    {
        return 'Foo\\Bar!' . PHP_EOL;
    }
}

namespace FooBar;

class Bar
{
    public function teste()
    {
        return 'FooBar\\Baz!' . PHP_EOL;
    }
}

$bar = new \Foo\Bar();
echo $bar->teste();


$bar = new \FooBar\Bar();
echo $bar->teste();

Acho que por fazer o import da classe ele acaba resolvendo o possível conflito.

2 respostas
solução!

Olá, Gabriel! Tudo bem?

Entendo sua confusão, a documentação do Composer pode ser um pouco complexa às vezes.

O parágrafo da documentação que você citou está se referindo à forma como o Composer lida com o mapeamento de namespaces para diretórios no sistema de arquivos. O uso do \\ no final de um prefixo de namespace é para evitar conflitos entre namespaces similares.

Vamos usar o seu exemplo para entender melhor. Você tem dois namespaces: Foo e FooBar. Se você não usar \\ no final do prefixo do namespace, o Composer pode confundir Foo com FooBar, porque Foo é um prefixo de FooBar.

Então, quando você usa Foo\\ e FooBar\\, você está dizendo ao Composer que esses são dois namespaces distintos. Isso evita que o Composer confunda Foo com FooBar.

No seu exemplo de código, não há conflito porque você está usando o namespace completo ao instanciar as classes (\Foo\Bar e \FooBar\Bar).

Mas imagine que você tenha um grande projeto com muitos namespaces e classes. Sem o uso do \\ no final do prefixo do namespace, você poderia acabar com conflitos de nomes de classes e isso poderia causar erros no seu código.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Oi Armano, entendi, seria mas uma questão na implementação do composer e como fizeram para resolver o problema. Estava pensando que era algo relacionado ao funcionamento dos namespace no PHP. Obrigado pela ajuda