35 votes

À l'espace de noms PHP ou pas à l'espace de noms PHP

D'accord, je suis relativement nouveau en programmation PHP et j'ai avancé sans savoir qu'il est possible d'utiliser des espaces de noms en PHP comme je peux le faire en c# etc.

Cependant, c'est vraiment moche car ils ont décidé d'utiliser des barres obliques inverses - pourquoi ?

Quoi qu'il en soit, je suis intéressé par l'avis d'autres programmeurs PHP sur le fait de savoir si les espaces de noms vont devenir populaires en PHP et si je devrais commencer à les utiliser dès maintenant ?

6voto

Johan Points 192

Voici quelques tentatives de solution pour ceux qui se demandent comment fonctionne l'espace de noms, sans php 5.3.

Tout d'abord, je dois dire que seul le préfixe a fonctionné pour moi, les autres solutions ci-dessous sont plutôt des notes sur ce qu'il ne faut pas faire.

La fonctionnalité de l'espace de noms peut être nécessaire si, par exemple, on produit des plugins wordpress, en utilisant votre bibliothèque de fonctions valorisée dans ceux-ci. Normalement, vous ne pouvez pas avoir plusieurs plugins avec des déclarations de fonctions identiques, cela causerait des erreurs fatales.

SOLUTION 1: préfixez toutes les fonctions de votre bibliothèque avec nom_du_plugin_ ou espace_de_noms_

 function str_len_utf8($str)

devient

 function photoplugin_str_len_utf8($str)

C'est juste une question de recherche et remplacement. Facile si les fonctions sont déjà préfixées de manière unique :

john_str_len_utf8() => photoplugin_john_str_len_utf8()

Bon pour l'âme aussi, soutient l'ego, 'bibliothèque de chaînes de John' :D

Si vous choisissez des préfixes courts et agréables avec un peu de bon sens, cela fonctionne à merveille, comme on dit.

SOLUTION 2: encapsulez toutes vos fonctions de bibliothèque/réutilisation dans une classe.

class photopluginlib
     {
     function str_len_utf8($a){ $a=$this->str_clean_utf8($a); ...}
     ...
     }

Tous les appels de fonctions dans la classe à la classe sont préfixés par $this->. Une fois que cette classe est préparée, on peut l'utiliser à plusieurs reprises sans recherche et remplacement, il suffit de changer le nom de la classe. Utilisation :

$photopluginlib=new photopluginlibrary();
$b=$photopluginlib->str_len_utf8($a);

SOLUTION 3: encapsulez toutes vos fonctions de bibliothèque/réutilisation dans une classe, et utilisez l'opérateur ::

class photopluginlib
     {
     static function str_len_utf8($a){ $a=self::str_clean_utf8($a); ...}
     ...
     }

Toutes les déclarations de fonctions dans la classe ont le mot-clé static devant function.

Tous les appels de fonctions à l'intérieur de la classe à la classe sont préfixés par self::

Une fois que cette classe est préparée, on peut l'utiliser sans recherche et remplacement. Le nom de la classe est l'espace de noms, en quelque sorte. On ne fait que changer le nom de la classe et l'utiliser en tant que tel.

$b=photopluginlib::str_len_utf8($a);
$c=photopluginlib::database_row(...)

Pas besoin d'instancier la classe.

Ça a l'air plus propre que $photopluginlib->str_len_utf8(), mais je préfère toujours photoplugin_john_str_len_utf8()

Notes

  • toutes les bibliothèques doivent aller dans 1 grande déclaration de classe de bibliothèque, vous ne pouvez pratiquement pas ajouter des méthodes aux classes plus tard en php.
  • vous ne pouvez pas simplement déclarer de nouvelles fonctions de bibliothèque ici et là dans différents fichiers php.
  • si plusieurs bibliothèques sont utilisées, et qu'elles s'utilisent mutuellement, elles doivent utiliser self:: pour les appels de fonction.
  • php5.2.17, courant en 2013, n'accepte pas call_user_func('photopluginlib::functionname'), il faut utiliser call_user_func(Array('photopluginlib','functionname')) ou à l'intérieur de la classe, call_user_func(Array(__CLASS__,'functionname')), ce qui signifie une réécriture du code pour wp add_action, preg_replace_callback etc.
  • nécessite php>=5
  • impossible de mélanger le code et les déclarations de fonctions, comme dans:

class photopluginlib{ add_filter('html','myfilter'); static function myfilter($html){return ''} }

  • Pour un grand code, cela peut rapidement devenir un casse-tête compliqué.

Je préfère simplement utiliser des préfixes jusqu'à ce que la vraie fonctionnalité, les espaces de noms, soient largement disponibles.

Ces solutions signifient toujours qu'il faut préfixer toutes les utilisations de fonctions. La fonctionnalité de l'espace de noms signifierait que l'on pourrait utiliser des fonctions sans les préfixer, le préfixe ne serait nécessaire qu'une seule fois, au début du fichier php :

`

En passant, passer à php5.3 a un avantage supplémentaire, si vous pouvez choisir de ne pas coder pour php5.2 (encore partout, année 2013) Php5.3 vs php 5.2.17 signifie une augmentation instantanée de la vitesse. On dirait que des augmentations de vitesse de l'ordre de %30 etc sont disponibles, sans parler du côté base de données :

http://onlinephpfunctions.com/benchmarks

J'espère que cela inspire quelques solutions pour ceux qui recherchent des espaces de noms.

`

5voto

mario Points 76989

Son utilisation est déjà en train de se répandre. Quelques projets l'utilisent dans leurs prochaines versions ou versions bêta. La plupart des exemples que j'ai vus l'utilisent cependant de manière rituelle. Doctrine2, par exemple, utilise cinq ou plusieurs espaces de noms imbriqués (odeur de code), probablement pour assurer une correspondance 1:1 entre l'espace de noms/classe et le système de fichiers/répertoires. Je suppose que la nouveauté rend les espaces de noms PHP sujets à un usage excessif non raisonné.

Quoi qu'il en soit, la syntaxe n'aide pas vraiment à la lisibilité. Et cela rebute les programmeurs professionnels. Mais s'il y a un cas d'utilisation sérieux dans votre projet, allez-y. (Les conflits de noms hypothétiques ne sont pas la meilleure raison.)

3voto

Aaron Harun Points 7222

À moins que tout votre code ne s'exécute sur vos propres serveurs, il est trop tôt pour commencer à les utiliser car 5.3 est relativement récent.

À part cela, je ne suis pas sûr qu'ils vont vraiment devenir populaires. Même les classes ont pris du temps avant d'être adoptées par une grande partie de la population de programmeurs PHP.

3voto

Ils ne vont probablement pas s'habituer à eux tant que le noyau ne les utilise pas (peut-être dans PHP 7...), mais utiliser Python pendant quelques mois vous montrera que les espaces de noms sont GÉNIAUX.

1voto

webjawns.com Points 1285

Je commencerais à apprendre comment utiliser les espaces de noms le plus tôt possible. Zend Framework 2.0 utilisera des espaces de noms, ce qui signifie que toute personne utilisant PHP 5.2 ou moins sera bientôt dépassée. J'utilise un serveur dédié virtuel, donc je peux contrôler ma version de PHP. Si vous utilisez cPanel/WHM, vous pouvez installer PHP 5.3 très facilement. Si vous êtes sur un hébergement mutualisé, il faudra peut-être un peu de temps avant que vous ne voyiez PHP 5.3 installé, bien qu'il y ait des utilisateurs de 5.3.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X