web-dev-qa-db-fra.com

Comment nommer des fichiers de classes namespaced?

WP Manuel de base> PHP Normes de codage> Conventions de dénomination suggère ce qui suit pour nommer des fichiers avec des classes:

Les noms de fichier de classe doivent être basés sur le nom de classe avec class- ajouté en début de ligne et les traits de soulignement dans le nom de classe remplacés par des tirets, par exemple WP_Error devient:

class-wp-error.php

Bien que, d'après le libellé de la section, il soit principalement destiné à core use, le style de codage général s'applique généralement (et devrait à mon avis) s'appliquer à un code tiers WP.

Cependant, puisque le noyau ne supporte pas les espaces de noms (PHP 5.2, ough), cela ne représente pas un tel cas.

Quelle est la manière pratique d’y aller du point de vue de la commodité des développeurs? Prise en charge des autochargeurs?

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
  • en utilisant un autre schéma de nommage, tel que PSR
8
Rarst

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

Le moyen le plus simple de séparer les noms d'espaces de noms et les noms de classes, d'interfaces et de traits consiste (selon mon expérience) à attribuer des espaces de noms à des noms de répertoires et des noms de classes à des noms de fichiers. Cela rend très facile de mapper la classe demandée sur une structure de fichier donnée dans le chargeur automatique: il suffit de convertir \ en /, d'ajouter .php et de charger le fichier.

Cela facilite également la mise en cache des recherches: pour chaque répertoire/espace de nom, 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() tous les temps.

6
fuxia

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

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

L'explication est complète, mais il s'agit essentiellement d'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 
) );
1
Pablo S G Pacheco

Je vais généralement avec la seconde moitié de vos options:

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

Si vous utilisez composer pour enregistrer un chargeur automatique PSR-4, vous pouvez rester proche des conventions de dénomination WP. Les espaces de noms mappés sur un ou plusieurs dossiers pouvant contenir des traits de soulignement avec des fichiers portant le même nom que la classe pouvant également contenir des traits de soulignement. Comme:

<Namespace_Dir>/Class_Name.php

Lorsque WP passe à php 5.3+ (cela doit arriver, non?!), Les directives doivent être mises à jour. Puisque PSR-0 est déjà obsolète, PSR-4 devrait au moins être recommandé, sinon nécessaire.

1
cfoellmann

la solution de pablo-s-g-pacheco a fonctionné pour moi, le chargement automatique reposant sur un composeur tout en étant compatible avec les normes de codage WordPress, cependant, l'URL du rapport Github est:

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

et le nom du paquet est:

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

Enfin, vous devrez également ajouter les éléments suivants à 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"
}] 
0
guillaume.molter