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.
`