Prós e contras dos namespaces vs incluir / exigir no PHP?

20

Recentemente, comecei a usar namespaces em PHP. Quando os vi pela primeira vez, achei que a sintaxe deles era feia e eu nunca os usaria. No entanto, criei um carregador automático (spl_autoload_register) que faz com que eu nunca precise escrever uma instrução de inclusão / necessidade novamente.

Gosto de espaços para nome, mas há algum benefício objetivo sobre as instruções de inclusão / exigência ou elas são exatamente o mesmo método para atingir o mesmo objetivo?

NobleUplift
fonte
1
Os espaços para nome impedem colisões com bibliotecas de terceiros.
Reactgular
1
No momento, o principal benefício para mim em relação aos espaços para nome é o carregamento automático. Por exemplo, eu uso in-line new \Vendor\Namespace\Class()sem uma declaração de solicitação anteriormente no método ou classe.
NobleUplift
3
Muitas bibliotecas PHP usam carregamento automático sem espaços para nome. O PHP deve tornar os espaços de nomes obrigatórios.
Reactgular
Nenhum argumento de mim. Gostaria de ver todas essas alterações listadas aqui .
NobleUplift

Respostas:

21

Os espaços para nome não são apenas para o carregamento automático de classes. Eles também evitam conflitos de nomes. De fato, esse é o objetivo principal.

Digamos que você tenha um projeto que precise de uma classe chamada User, para armazenar informações sobre os usuários do seu aplicativo, mas um plug-in também usa uma classe (diferente) chamada Userpara armazenar informações. Os espaços para nome permitem que você crie sua classe em um espaço para nome (digamos MyApp) e o plug-in use outro espaço para nome (digamos CoolPlugin). Código dentro do MyAppespaço pode apenas se referir a User(por exemplo, new User();), e também pode codificar no CoolPluginespaço; cada um obterá o resultado esperado. Quando você precisar usar o código de outro espaço para nome, basta prefixá-lo. Por exemplo, o código no CoolPluginespaço pode acessar a Userclasse MyAppvianew \MyApp\User();

A alternativa é que toda classe precisa de um nome complexo em qualquer lugar , como class MyApp_Usere class CoolPlugin_User. Os espaços para nome permitem simplificar as coisas na maioria das vezes e evitar conflitos de nomes o tempo todo.

Editar: Para responder à pergunta "Existe alguma diferença de desempenho entre os dois?"

Não é significativo, não. Não fiz comparações, mas provavelmente há uma diferença no nível de nanossegundos. Dito isso, sacrificar a qualidade do código por ajustes de desempenho super pequenos não é uma boa estratégia; portanto, você deve usar espaços para nome independentemente. Para referências de problemas semelhantes, consulte PHPbench.com e esta resposta StackOverflow .

Seu código precisa ser incrivelmente rígido e extremamente sensível ao tempo (pense em negociações de alta frequência ou no gerenciamento de reações nucleares) antes que você precise se preocupar em otimizar o micro neste tipo de contexto. Se realmente é sensível ao tempo, você provavelmente deve codificar em ou mesmo , não linguagens interpretadas como PHP.

elixenida
fonte
1
+1 Eu simplesmente observo que todo projeto começa a parecer que não poderia precisar de espaços para nome e, em seguida, cresce facilmente a ponto de tornar-se ridículo invadir as coisas para funcionar sem elas. Não ter namespaces é basicamente o mesmo que declarar todas as variáveis ​​globais, aplicadas às classes. Em bases de código maiores ou aquelas que fazem uso liberal de bibliotecas, torna-se uma bagunça total.
BrianH
1
Por favor, veja minha edição acima.
Elixenide
2
Eu mencionei que estou criando uma interface PHP para o Large Hadron Collider? Caso contrário, acredito que essa resposta seja suficiente, obrigado.
NobleUplift
1
Por favor, não crie estrelas de quarks ou buracos negros! Feliz em ajudar.
Elixenide
1
Não se preocupe, apenas strangelets. Estamos criando canhões de hádrons - quero dizer, algo científico e não armado.
NobleUplift