Espaces de noms PHP dans WordPress – un guide pratique

Publié: 2018-10-16

Les espaces de noms PHP ont presque dix ans. Oui, une décennie s'est écoulée (et oui, vous vieillissez). Malgré une décennie qui s'est écoulée depuis la sortie de PHP v5.3, de nombreux développeurs n'ont toujours pas une compréhension de base des espaces de noms. À vrai dire, WordPress n'utilise pas d'espaces de noms , donc " vous n'avez pas besoin de savoir comment utiliser les espaces de noms si vous ne travaillez qu'avec WordPress ". Vous n'avez pas besoin d'être un ninja de l'espace de noms, mais comprendre les bases est simple et vous fait du bien.

Les espaces de noms PHP existent depuis une décennie, et vous ne les utilisez toujours pas parce que #wordpress non plus ? Lisez-les et commencez à les utiliser en 2 minutes ! #développement

CLIQUEZ POUR TWEETER

Lorsqu'il n'y a pas de support d'espace de noms - utilisez un préfixe

Pendant très, très longtemps, PHP n'a pas pris en charge les espaces de noms natifs. C'est pourquoi WordPress et beaucoup d'autres grandes bases de code n'utilisent pas d'espaces de noms natifs. Ils n'étaient pas là en cas de besoin, donc des préfixes sont utilisés.

L'espacement des noms est important car il garantit que votre fonction write_to_log() n'a pas déjà été définie par un autre morceau de code. Pour éviter les conflits de noms, tout dans la portée globale a besoin d'un préfixe afin que la fonction devienne awesome_project_write_to_log() et toutes les autres fonctions et variables obtiennent également le préfixe awesome_project_ . Simple? Il est! Jolie? Pas exactement.

Il existe des alternatives à cette approche comme l'encapsulation des méthodes statiques. Vous encapsulez toutes vos fonctions dans une classe et les déclarez en tant que méthodes statiques. Ensuite, au lieu d'appeler my_function() , vous appelez My_Class::my_function() . Mieux? Un espacement de noms un peu, mais toujours pas approprié.

Voyons comment l'espacement des noms permet à plusieurs morceaux de code (ou packages si vous le souhaitez) d'utiliser les mêmes noms de classe et de fonction sans conflit. Ou comme le dit le manuel PHP - comment ils permettent l'encapsulation du code. Leur analogie avec les fichiers et les dossiers est également parfaite - à bien des égards, les espaces de noms se comportent comme des dossiers, je vais donc copier/coller à partir du manuel ;

Dans tout système d'exploitation, les répertoires servent à regrouper les fichiers associés et agissent comme un espace de noms pour les fichiers qu'ils contiennent. Par exemple, le fichier foo.txt peut exister à la fois dans le répertoire /home/greg et dans /home/other, mais deux copies de foo.txt ne peuvent pas coexister dans le même répertoire. Pour accéder au fichier foo.txt en dehors du répertoire /home/greg, nous devons ajouter le nom complet du répertoire au nom du fichier en utilisant le séparateur de répertoire pour obtenir /home/greg/foo.txt.

Déclarer des espaces de noms - rappelez-vous la première ligne

L'espace de namespace de mots clés doit être la première ligne de code du fichier (sans compter les commentaires et tout contenu non PHP). Les espaces de noms n'affectent que les classes, les interfaces, les fonctions et les constantes. Ils n'affectent pas les variables. Vous pouvez définir le même espace de noms dans plusieurs fichiers, ce qui vous permet de diviser le code en plusieurs fichiers. Les sous-espaces de noms permettent de définir une hiérarchie dans les espaces de noms un peu comme dans les dossiers en utilisant une barre oblique inverse - namespace myproject\level1\level2 . Ce sont des règles de base et presque toutes pour déclarer des espaces de noms.

// file-A.php contains a function under the myCompany\PackageA namespace
namespace myCompany\PackageA;
 
function do_something() {
  // do things
}
// file-B.php contains a function with the same name
// but under a different namespace
namespace myCompany\PackageB;
 
function do_something() {
  // do things
}

Bien que cela soit possible, je vous recommande fortement de ne pas combiner plusieurs espaces de noms dans un seul fichier. Croyez-moi, tôt ou tard, vous oublierez que vous l'avez fait et le débogage d'un bogue de 2 minutes prend deux heures. Cependant, si vous devez, voici la syntaxe.

// do not put multiple namespace declarations into the same file
// but if you must, here's the syntax

namespace MyFirstProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

namespace MySecondProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

// any code after this has to go in the global namespace
namespace {
  $some_var = 1;
  function_in_global_namespace();
}

Utilisation des espaces de noms - rappelez-vous des dossiers

Comme je l'ai déjà dit, les espaces de noms sont extrêmement similaires aux dossiers. En supposant que le fichier foo.txt se trouve dans votre dossier actuel ; vous pouvez le référencer avec un simple foo.txt . Si vous êtes un niveau au-dessus du dossier avec le fichier foo.txt , vous devez utiliser un chemin relatif ../foo.txt ou un chemin absolu /folder1/folder2/foo.txt . Rien d'extraordinaire. Les espaces de noms utilisent le même paradigme.

// remember after declaring a namespace
// all our code is in it; like when you're working in a folder
namespace mycompany\project;

function foo() {}
class foo {
  static function staticmethod() {}
}

// resolves to mycompany\project\foo() because of line #3
foo();

// likewise, resolves to mycompany\project\foo::staticmethod()
foo::staticmethod();

// constant are affected by namespaces too
// so we're working with mycompany\project\FOO
echo FOO;

// this is a relative path
// resolves to mycompany\project\subnamespace\foo()
subnamespace\foo();

// static methods are no different
// mycompany\project\subnamespace\foo::staticmethod()
subnamespace\foo::staticmethod();
                                 
// a full namespace path starts with a backslash
// it resolves exactly to what it says it does
\otherNamespace\Bar\foo();

// again same thing for a constant, full path nothing magical
echo \otherNamespace\Bar\FOO;

Jetez un œil au mot-clé use dans le manuel PHP - les exemples sont excellents. Il fournit un moyen d'importer du code d'autres espaces de noms PHP dans l'espace de noms actuel ou de faire référence à un nom externe (complet) avec un alias.

Oui, vous avez besoin d'espaces de noms et devez les utiliser

Comme c'est plus qu'évident en regardant la source de WordPress - vous n'avez pas besoin d'utiliser des espaces de noms, mais vous devez utiliser une méthode d'espacement de noms. Préfixe avec wp_ dans le cas de WP. Donc, si nous le faisons déjà, pourquoi ne pas le faire correctement ?

Les espaces de noms en PHP s'intègrent facilement dans n'importe quel workflow de développement. Ils facilitent le chargement automatique, la dénomination des fichiers et, en général, rendent le code plus propre. Refactoriser l'ancien code n'est jamais une tâche populaire (quel que soit le langage de codage), donc je ne vais pas vous dire d'aller de l'avant et de refactoriser un projet de 2 Mo fonctionnel juste pour que vous puissiez dire que vous utilisez des espaces de noms. Cependant, je vais insister pour que vous utilisiez des espaces de noms lorsque vous travaillez sur de nouveaux projets. Vous vous remercierez bien assez tôt.

La documentation PHP officielle sur les espaces de noms est plus qu'excellente ! Les exemples de code sont propres et les commentaires utiles dans le monde réel. Assurez-vous de le parcourir, même si vous ne pensez pas en avoir besoin.