web-dev-qa-db-fra.com

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

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?

21
NobleUplift

Les espaces de noms ne sont pas réservés aux classes à 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 User, pour stocker des informations sur les utilisateurs de votre application, mais un plugin utilise également une classe (différente) nommée User pour 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'espace MyApp peut simplement faire référence à User (par exemple, new User();), et peut donc coder dans l'espace CoolPlugin; chacun obtiendra le résultat attendu. Lorsque vous devez utiliser le code de un autre namespace, vous n'avez qu'à le préfixer. Par exemple, le code dans l'espace CoolPlugin peut accéder à la classe User dans MyApp via new \MyApp\User();

L'alternative est que chaque classe a besoin d'un nom complexe partout, comme class MyApp_User et 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 de très petits ajustements de performances n'est pas une bonne stratégie, vous devez donc utiliser des espaces de noms malgré tout. Pour des références de types de problèmes similaires, voir PHPbench.com et cette réponse StackOverflow .

Votre code doit être incroyablement serré et incroyablement 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 genre de contexte. Si c'est vraiment sensible au temps, vous devriez probablement coder en c ou même Assembly , pas des langages interprétés comme PHP.

22
elixenide