Avantages et inconvénients des espaces de noms vs inclure / exiger en PHP?

20

J'ai récemment commencé à utiliser des espaces de noms en PHP. Quand je les ai vus pour la première fois, je pensais que leur syntaxe était moche et je ne les utiliserais jamais. Cependant, j'ai créé un chargeur automatique (spl_autoload_register) qui fait en sorte que je n'ai plus jamais à écrire une instruction include / require.

J'aime les espaces de noms, mais y a-t-il un avantage objectif par rapport aux instructions include / require, ou s'agit-il exactement de la même méthode pour atteindre le même objectif?

NobleUplift
la source
1
Les espaces de noms empêchent les collisions avec des bibliothèques tierces.
Reactgular
1
À l'heure actuelle, le principal avantage pour moi concernant les espaces de noms est le chargement automatique. Par exemple, j'utilise en ligne new \Vendor\Namespace\Class()sans instruction require plus tôt dans la méthode ou la classe.
NobleUplift
3
De nombreuses bibliothèques PHP utilisent le chargement automatique sans espaces de noms. PHP devrait rendre les espaces de noms obligatoires.
Reactgular
Aucun argument de ma part. J'aimerais voir tous ces changements répertoriés ici .
NobleUplift

Réponses:

21

Les espaces de noms ne sont pas réservés aux classes de chargement automatique. Ils empêchent également les conflits de noms. En fait, c'est leur objectif principal.

Supposons que vous ayez un projet qui nécessite une classe nommée Userpour stocker des informations sur les utilisateurs de votre application, mais un plugin utilise également une classe (différente) nommée Userpour stocker des informations. Les espaces de noms vous permettent de créer votre classe dans un espace de noms (par exemple MyApp) et de laisser le plugin utiliser un autre espace de noms (par exemple CoolPlugin). Le code dans l' MyAppespace peut simplement faire référence à User(par exemple, new User();), tout comme le code dans l' CoolPluginespace; chacun obtiendra le résultat attendu. Lorsque vous devez utiliser du code provenant d' un autre espace de noms, vous n'avez qu'à le préfixer. Par exemple, le code dans l' CoolPluginespace peut accéder à la Userclasse MyAppvianew \MyApp\User();

L'alternative est que chaque classe a besoin d'un nom complexe partout , comme class MyApp_Useret class CoolPlugin_User. Les espaces de noms vous permettent de simplifier les choses la plupart du temps et d'éviter les conflits de nommage tout le temps.

Edit: Pour répondre à la question, "Y a-t-il une différence de performances entre les deux?"

Pas significatif, non. Je ne l'ai pas comparé, mais il y a probablement une différence au niveau nanoseconde. Cela dit, sacrifier la qualité du code pour des réglages de performances très petits n'est pas une bonne stratégie, vous devez donc utiliser les espaces de noms malgré tout. Pour des références de types de problèmes similaires, consultez PHPbench.com et cette réponse StackOverflow .

Votre code doit être incroyablement serré et extrêmement sensible au temps (pensez au trading à haute fréquence ou à la gestion des réactions nucléaires) avant de vous soucier de la micro-optimisation dans ce type de contexte. Si c'est vraiment sensible au temps, vous devriez probablement coder en ou même en , pas dans des langages interprétés comme PHP.

élixénide
la source
1
+1 Je note simplement que chaque projet commence à sembler ne pas avoir besoin d'espaces de noms, puis se développe facilement au point qu'il devient ridicule de pirater des choses pour fonctionner sans elles. Ne pas avoir d'espaces de noms revient essentiellement à déclarer chaque variable globale, appliquée aux classes. Sur de plus grandes bases de code ou celles qui font un usage libéral des bibliothèques, cela devient un gâchis total.
BrianH
1
Veuillez voir ma modification ci-dessus.
elixenide
2
Ai-je mentionné que je fais une interface PHP pour le Grand collisionneur de hadrons? Sinon, je pense que cette réponse est suffisante, merci.
NobleUplift
1
Veuillez ne pas créer d'étoiles de quark ou de trous noirs! Heureux de vous aider.
elixenide
1
Ne vous inquiétez pas, seuls les strangelets. Nous créons des canons à hadrons - je veux dire, quelque chose d'efficace et pas d'armes.
NobleUplift