Chargement automatique orienté objet dans WordPress, partie 3

Dans le dernier tutoriel, nous avons passé en revue l'état initial de notre chargeur automatique, puis avons suivi un processus d'analyse et de conception orientée objet. Le but est de rassembler tout ce que nous avons couvert dans cette série et dans la série introductive.. 

Deuxièmement, l'objectif de cette opération dans son propre didacticiel est de nous permettre de passer le reste de notre temps à parcourir notre classe, en examinant le lien entre chaque partie, en l'implémentant dans notre plug-in, puis en expliquant comment appliquer la programmation orientée objet et la principe de responsabilité unique peut conduire à une solution plus ciblée et maintenable.

Avant de commencer

À ce stade, je suppose que vous avez suivi cette série. Si ce n'est pas le cas, passez en revue les première et deuxième parties. Celui-ci suppose que vous avez suivi jusqu'ici.

Si vous êtes débutant, je vous recommande de lire également la série initiale dans son intégralité. Une fois que vous êtes pris au dépourvu, vous devriez être en mesure de terminer la série. Nous concluons avec le reste du code source traité dans ce tutoriel..

Ce que nous avons fait jusqu'à présent

Pour fournir un résumé rapide et nous assurer que nous sommes tous sur la même page, nous avons abordé les sujets suivants dans cette série:

  • examiné la définition d'une interface de classe
  • vu comment une classe implémente une interface
  • examiné le principe de responsabilité unique
  • analysé notre autochargeur existant
  • créé une feuille de route pour notre version orientée objet de l'autochargeur
  • et conçu une implémentation de base pour une version orientée objet de l'autochargeur

À ce stade, nous sommes prêts à échanger notre autochargeur existant avec le code orienté objet. Notez cependant que ce ne sera pas une simple question de changer de fichier. 

Ce qu'il faut faire

Au lieu de cela, nous allons devoir créer les fichiers, s’assurer qu’ils respectent les normes de codage WordPress, les implémenter, tester leur implémentation pour s’assurer que le plug-in fonctionne toujours, puis supprimer l’autochargeur existant..

Cela ressemble à beaucoup de travail, mais si notre analyse et la conception du didacticiel précédent ont été effectuées correctement et s’avèrent exactes, nous ne devrions avoir aucun problème à faire tout ce qui est indiqué ci-dessus..

Votre environnement de développement

Avant de passer à la mise en œuvre, je souhaite fournir un bref aperçu de l’environnement de développement que vous devriez avoir sur votre système. Techniquement, c'est quelque chose que vous devriez déjà avoir en cours d'exécution conformément aux instructions des tutoriels précédents, mais je veux être aussi complet que possible..

  • un environnement de développement local adapté à votre système d'exploitation
  • un répertoire à partir duquel WordPress 4.6.1 est hébergé
  • un éditeur de texte ou IDE
  • connaissance de l'API du plugin WordPress

Cela dit, commençons.

Mise en œuvre orientée objet

Dans cette section, nous allons revoir tout le code que nous avons examiné dans le didacticiel précédent; cependant, nous allons examiner chaque fichier individuel avec une documentation complète.

De plus, nous allons l'inclure dans notre projet afin que, à la fin du tutoriel, nous puissions utiliser ce code à la place du code unique, basé sur les procédures, que nous avons utilisé précédemment..

Notez que chacun des fichiers suivants doit être nommé comme indiqué et doit être inclus dans le inc annuaire. De plus, tout cela est disponible au téléchargement en utilisant le bouton bleu dans la barre latérale de ce message..

class-autoloader.php

namespace_validator = new NamespaceValidator (); $ this-> file_registry = new FileRegistry ();  / ** * Tente de charger le nom de fichier spécifié. * * @param string $ filename Le chemin du fichier que nous essayons de charger. * / fonction publique load ($ filename) if ($ this-> namespace_validator-> is_valid ($ filename)) $ this-> file_registry-> load ($ filename);  

class-namespace-validator.php

class-file-investigator.php

get_file_name ($ file_parts, $ current, $ i); if (count ($ file_parts) - 1! == $ i) $ filepath = trailingslashit ($ filepath);  return $ filepath;  / ** * Récupère l'emplacement d'une partie du nom de fichier sur le disque en fonction de l'index actuel du tableau * examiné. * * @access private * @param array $ file_parts Le tableau de toutes les parties du nom de fichier. * @param string $ current La partie actuelle du fichier à examiner. * @param int $ i Index actuel du tableau de $ file_parts à examiner. * @return string Le nom du fichier sur le disque. * / private function get_file_name ($ pièces_fichiers, $ actuel, $ i) $ fichier = "; if (nombre ($ pièces_fichiers) - 1 === $ i) si ($ ceci-> is_interface ($ fichiers_fichiers))  $ filename = $ this-> get_interface_name ($ file_parts); else $ filename = $ this-> get_class_name ($ current); else $ filename = $ this-> get_nomspace_name ($ current); return $ filename ; / ** * Détermine si le fichier spécifié en cours d'examen est une interface. * * @Access private * @param array $ file_parts Parties du chemin de fichier à examiner. * @Return bool True si l'interface est contenue dans le nom du fichier; sinon , false. * / private function is_interface ($ file_parts) return strpos (strtolower ($ file_parts [count ($ file_parts) - 1]), 'interface'); / ** * Récupère le nom du fichier de l'interface en fonction du des parties spécifiées du fichier passées * dans l'autochargeur. * * @access private * @param array $ file_parts nction get_interface_name ($ file_parts) $ interface_name = explode ('_', $ file_parts [count ($ file_parts) - 1]); $ nom_interface = $ nom_interface [0]; return "interface- $ nom_interface.php";  / ** * Génère le nom de la classe filename sur le disque. * * @access private * @param string $ current Elément actuel du nom de fichier à examiner. * @return string Le nom de fichier de la classe sur le disque. * / private function get_class_name ($ current) return "class- $ current.php";  / ** * Crée un mappage de l'espace de noms sur la structure de répertoires. * * @access private * @param string $ current La partie actuelle du fichier à examiner. * @return string Le chemin d'accès de l'espace de noms mappé à la structure de répertoires. * / private function get_namespace_name ($ current) return '/'. $ actuel;  

class-file-registry.php

investigateur = nouveau FileInvestigator ();  / ** * Utilise l'investigateur de fichier pour récupérer l'emplacement du fichier sur le disque. Si trouvé, alors il sera inclus dans le projet; sinon, un message d'erreur WordPress sera généré. * * @param string $ filepath Le chemin du fichier sur le disque à inclure dans le plugin. * / public function load ($ chemin du fichier) $ chemin du fichier = $ this-> investigator-> get_filetype ($ chemin du fichier); $ filepath = rtrim (plugin_dir_path (nomrépertoire (__FILE__)), '/'). $ filepath; if (file_exists ($ filepath)) include_once ($ filepath);  else wp_die (esc_html ('Le fichier spécifié n'existe pas.'));  

Inclusion des fichiers, démarrage de l'autochargeur

Maintenant que nos fichiers sont créés, nous devons apporter deux autres modifications mineures:

  1. Nous devons inclure toutes les classes dans le répertoire inc..
  2. Nous devons nous débarrasser de l'ancien code de l'autoloader.
  3. Et nous devons utiliser notre nouvel autochargeur avec le spl_autoload_register une fonction.

En fin de compte, la version finale de autoload.php devrait ressembler à ceci:

Et cela accomplira exactement ce que nous avons décrit ci-dessus.

Mais attendez, je reçois une erreur!

À ce stade, vous avez effectué beaucoup de travail. Vous avez restructuré l'intégralité de votre autochargeur pour utiliser la programmation orientée objet. Vous avez documenté vos classes et fonctions. Vous avez créé de nouveaux fichiers, supprimé du code d'anciens fichiers et vous êtes prêt à vous assurer que tout fonctionne comme prévu..

Ainsi, comme le ferait tout développeur, vous lancez la fenêtre du navigateur pour actualiser la page. Un message d'erreur s'affiche:

Heureusement, c'est une solution facile. Le problème est que nous essayons d’ajouter notre méta-boîte trop tôt. Pour résoudre ce problème, nous mettrons à jour le init méthode dans notre Meta_Box classe à inclure ceci:

Et ensuite, nous introduirons une fonction qui sera liée au travail que nous venons de faire:

display, 'render'), 'post', 'side', 'high'); 

À ce stade, vous devriez pouvoir exécuter le nouveau code sans aucun problème, aucun avertissement, aucune notification et aucune erreur..

Conclusion

Travailler à travers tout cela aurait pu sembler beaucoup, et ce l'était! Mais la bonne chose est qu'il a couvert beaucoup de terrain dans trois tutoriels, et il a construit sur le travail d'une série précédente. À cet égard, de nombreux nouveaux sujets ont été abordés et de nouvelles techniques ont été apprises..

Notez que j'écris régulièrement pour Envato Tuts + et que vous pouvez retrouver tous mes tutoriels précédents sur la page de mon profil. De plus, je discute souvent du développement de logiciels dans le contexte de WordPress sur mon blog et sur Twitter, alors n'hésitez pas à me suivre, peu importe l'endroit..

Cela dit, étudiez le code que nous avons abordé tout au long de cette série (et peut-être même avant) et voyez si vous ne pouvez pas utiliser certaines de ces techniques dans vos travaux actuels ou futurs..

Ressources

  • Utilisation des espaces de noms et du chargement automatique dans les plugins WordPress
  • Chargement automatique orienté objet dans WordPress, 1ère partie
  • Chargement automatique orienté objet dans WordPress, partie 2
  • Espaces de noms
  • Chargement automatique
  • Des interfaces
  • L'API du plugin WordPress
  • Principe de responsabilité unique