Comment nommer des fichiers de classes à espace de noms?

9

WP Core Handbook> PHP Coding Standards> Naming Conventions suggère ce qui suit pour nommer des fichiers avec des classes:

Les noms de fichiers de classe doivent être basés sur le nom de classe avec class- préfixé et les traits de soulignement dans le nom de classe remplacés par des tirets, par exemple WP_Errordevient:

class-wp-error.php

Bien que le libellé de la section soit principalement destiné à une utilisation de base , le style de codage dans son ensemble s'applique généralement (et devrait à mon avis) au code WP tiers.

Cependant, comme le noyau ne prend pas en charge les espaces de noms (PHP 5.2, ugh), cela ne tient pas compte de ce cas.

Quelle est la façon pratique de procéder du point de vue de la commodité du développeur? Prise en charge des chargeurs automatiques?

Je pouvais voir plusieurs façons alternatives:

  • ignorer complètement l'espace de noms
  • y compris l'espace de noms dans le nom de fichier
  • utiliser des espaces de noms comme niveaux de dossier
  • utilisant un schéma de nommage alternatif, tel que PSR
Rarst
la source
3
Mon opinion honnête est que si vous utilisez PHP 5.3+, vous violez déjà les règles de base de WP. De plus, considérez que les normes WP ne prennent pas en compte les interfaces ou les traits. Donc, pour moi, il est logique de choisir une méthode qui vous convient et d'utiliser une norme déjà établie comme le PSR semble un meilleur choix dans ce cas.
gmazzap

Réponses:

7

Tout d'abord, ignorez le class-préfixe. Cela vient de l'approche de code procédural pur de WordPress, les classes sont utilisées comme conteneurs pour le code procédural, pas pour des objets réels, et la plupart des fichiers ne contiennent pas du tout de classes ou des classes et d'autres codes ensemble. Cela n'a aucun sens lorsque tous vos fichiers contiennent une seule classe et rien d'autre.
Si vous suivez ce modèle, vous devrez utiliser interface-foo.phpet trait-bar.php. Cela n'a pas seulement l'air ridicule, cela rend le chargement automatique plus difficile que nécessaire.

La meilleure façon de séparer les espaces de noms et les noms de classe / interface / trait est (d'après mon expérience) d'attribuer des espaces de noms aux noms de répertoire et des noms de classe aux noms de fichiers. Cela rend très facile à cartographier la classe demandée à une structure de fichier donné dans le chargeur automatique: Il suffit de convertir \à /, append .phpet charger le fichier.

Cela facilite également la mise en cache des recherches: pour chaque répertoire / espace de noms, vous pouvez récupérer tous les fichiers existants la première fois que ce répertoire est demandé, et pour les appels ultérieurs, vous pouvez réutiliser cette liste de noms de fichiers sans demander à file_exists()chaque fois .

fuxia
la source
4
En d'autres termes: rendez-le compatible PSR :)
kaiser
2

J'ai créé une classe pour cette exigence, compatible avec PSR-4 et suivant les normes de codage Wordpress.

Vous pouvez y accéder ici: https://github.com/pablo-pacheco/wp-namespace-autoloader

L'explication est là mais en gros c'est une dépendance du compositeur. Il vous suffit de l'exiger dans votre projet:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

Et puis appelez la classe

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );
Pablo SG Pacheco
la source
1

Je vais généralement avec la deuxième moitié de vos options:

  • utiliser des espaces de noms comme niveaux de dossier
  • utilisant un schéma de nommage alternatif, tel que PSR

Si vous utilisez Composer pour enregistrer un chargeur automatique PSR-4, vous pouvez rester proche des conventions de dénomination WP. Des espaces de noms mappés sur des dossiers pouvant contenir des traits de soulignement avec des fichiers nommés comme la classe qui peut également contenir des traits de soulignement. Comme:

<Namespace_Dir>/Class_Name.php

Lorsque WP passe à php 5.3+ (cela doit arriver finalement, non?!), Les directives doivent être mises à jour. Étant donné que PSR-0 est déjà obsolète, PSR-4 devrait au moins être recommandé s'il n'est pas requis.

cfoellmann
la source
0

La solution de pablo-sg-pacheco a fonctionné pour moi, le chargement automatique reposant sur un compositeur pourtant compatible avec les normes de codage WordPress, cependant l'URL pour le dépôt Github est:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

et le nom du package est:

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

Enfin, vous devrez également ajouter ce qui suit à votre composer.json car le package n'est pas disponible sur packagist:

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
guillaume.molter
la source