Programmation orientée objet dans WordPress Héritage II

Dans l'article précédent, nous avons introduit le concept d'héritage orienté objet, essayé de le placer en termes simples, puis avons également examiné de près le modèle conceptuel de son fonctionnement dans le contexte de la programmation..

Mais avant d’aller plus loin et / ou si vous venez de rejoindre la série, veuillez relire tout ce que nous avons couvert à ce jour en lisant les articles précédents:

  1. Une introduction
  2. Des classes
  3. Les types
  4. Structures de contrôle: instructions conditionnelles
  5. Structures de contrôle: boucles
  6. Fonctions et attributs
  7. Portée
  8. Construire le plugin I
  9. Construire le plugin II
  10. Documenter le plugin I
  11. Documenter le plugin II
  12. Héritage I

Oui, nous en avons parcouru beaucoup, mais pour jeter les bases d'un débutant ayant une place solide pour commencer à écrire du PHP orienté objet, il y a beaucoup à examiner..

Cela dit, l’héritage est le point de départ des sujets intermédiaires du paradigme. C’est donc le dernier article qui présente les concepts du débutant, après quoi nous terminerons la série par un post résumé..

Héritage examiné

Rappelez-vous que nous avons défini l'héritage comme suit:

L'héritage survient lorsqu'une classe sert de classe parent pour une classe enfant qui fournit un certain nombre d'attributs et de méthodes communs au parent et à l'enfant. cependant, l'enfant en tant que capacité d'introduire ses propres attributs.

C'est un peu moins formel que ce que vous pouvez trouver dans un livre académique, ou même sur Wikipedia, mais cela explique quand même l'idée en termes qui illustrent le propos..

Dans cet article, nous allons passer en revue tout le code nécessaire, les fonctions et les mots réservés liés au sujet. Nous allons voir comment le mettre en œuvre dans PHP de manière très simple, indépendamment de la plate-forme. , Puis nous passerons en revue une implémentation réelle de l'héritage dans WordPress.

Donc, avec cet ensemble comme feuille de route pour l'article, allons de l'avant et commençons.

Installations PHP

Afin de mettre en œuvre l'héritage dans PHP orienté objet, il existe un certain nombre de mots réservés avec lesquels nous devons nous familiariser. Heureusement, la plupart des mots que nous avons déjà couverts et ceux que nous n'avons pas encore sont suffisamment clairs pour qu'il soit facile de les retenir..

Avant d’examiner le code, examinons tous les mots réservés dans le langage que nous devons connaître pour pouvoir commencer à créer quelque chose..

  • s'étend est un mot réservé qui indique qu'une classe est l'enfant d'une autre classe. Par exemple, dans notre article précédent, un Poster s'étend Contenu. Nous verrons cela bientôt.
  • privé est un attribut qui est appliqué aux propriétés et aux fonctions qui les rendent accessibles seulement dans le contexte de la classe dans laquelle ils sont définis.
  • protégé est similaire à privé à l'exception que les propriétés et méthodes marquées comme telles sont accessibles à la classe donnée et à toutes les classes enfants.
  • Publique est le contraire de privé en ce sens qu'il signifie que toute classe - la classe donnée, une sous-classe ou une classe tierce - peut accéder à la propriété ou à la méthode afin de modifier ses informations ou d'appeler la fonction.

Vous devez également connaître le :: opérateur, mais nous en parlerons un peu plus tard dans l'article lorsque nous commencerons à regarder le code.

Et c'est tout - rien de terriblement décourageant, n'est-ce pas? Et ce qui est encore mieux, c’est que si vous suivez avec nous tout au long de cette série, vous connaissez probablement tous les mots sauf s'étend.

Quoi qu'il en soit, cela dit, commençons à travailler sur un exemple.

Quelques exemples de code

Afin de commencer à écrire un exemple de code, nous devons définir exactement ce que nous allons essayer de modéliser (après tout, c'est ce que le code fait, n'est-ce pas?). 

En cohérence avec le thème utilisé dans cette série - en particulier dans le dernier article - nous aurons une classe parent appelée Contenu, et deux classes enfants dont chacune sera nommée Commentaire et Poster, respectivement.

Cela nous permettra de voir comment les propriétés et les méthodes existent au sein d'une même classe et comment les enfants peuvent accéder aux attributs de leurs parents, ainsi que comment les parents peuvent protéger leurs propriétés et leurs fonctions de leurs enfants..

Mais la mise en œuvre démontrera bien plus que d’en parler, alors commençons à écrire du code.

La classe parent

Dans notre exemple, la classe parente va être la Contenu parce que les deux sous-classes - c’est-à-dire le Poster et le Commentaire - sont des types de contenu auxquels sont associées des informations uniques qui ne sont pas spécifiques au Contenu classe.

La clé de l'héritage est d'identifier toutes les propriétés et méthodes communes à toutes les classes et de les conserver définies dans la classe parente ou, dans notre classe, dans Contenu.

Bien que cela puisse varier en fonction de votre façon de voir les choses, nous allons configurer Contenu tel qu'il comprend:

  • une date à laquelle le contenu a été publié
  • un auteur 
  • une méthode pour sauvegarder le contenu
  • une méthode pour formater le contenu
  • une méthode pour récupérer le contenu
  • et une méthode pour récupérer l'auteur du contenu 

D'abord, nous allons examiner le code, puis nous expliquerons tout ce qui s'y passe.

publish_date = $ date-> format ('Y-m-d H: i: s'); $ this-> author = "; fonction publique save ($ author, $ content) $ this-> author = $ author; $ this-> content = $ this-> format_content ($ content); $ this-> content ; fonction publique read () return $ this-> contenu; fonction privée format_content ($ content) return strip_tags (stripslashes ($ content)); fonction publique get_author () return $ this-> auteur;

Comme mentionné précédemment, nous avons deux protégé attributs et un privé attribut. Rappelons que cela signifie que toutes les sous-classes peuvent accéder au $ publish_date et le $ auteur, mais seulement la Contenu peut accéder au $ contenu attribut.

Notez également qu'une grande partie du code que vous voyez dans la classe ci-dessus est un PHP de base orienté objet. Rien de particulier ne concerne directement l'héritage, à l'exception de certains des modificateurs d'accès que nous avons déclarés. C'est-à-dire qu'il est relativement commun de code que nous avons vu jusqu'à présent dans ce tutoriel.

Une des choses à noter est que la fonction privée est en place pour démontrer deux choses:

  1. Comment privé les fonctions ne sont accessibles que dans le contexte de la classe dans laquelle sa définition.
  2. Enlève les balises et les barres obliques du contenu afin que le balisage ne puisse pas être enregistré avec le contenu.

Bien sûr, ce code n'est pas connecté à une base de données ou à un système de fichiers ou quoi que ce soit, mais le point reste.

Notez que, dans le code ci-dessus, nous avons dû ajouter quelques éléments pour répondre aux exigences de PHP. Ils vont au-delà de la portée de cet article, mais il convient de le souligner ici:

  • Le code à date_default_time_set est nécessaire pour définir le fuseau horaire sur lequel le temps peut être récupéré.
  • Le constructeur est responsable de la définition initiale de la date de publication du contenu et initialise la propriété author sur une chaîne vide. C'est pour qu'un Poster peut avoir son propre auteur et le Commentaire peut aussi avoir son propre auteur. Comme nous le verrons plus tard, un Commentaire peut même remplacer la date de publication par défaut.

Notez également que nous sommes en mesure de récupérer le contenu de la lis méthode et nous sommes en mesure d'obtenir l'auteur de la get_author une fonction.

Le premier enfant

Ensuite, allons de l'avant et créons le Poster sous-classe. Tout d'abord, nous allons jeter un coup d'œil au code, puis nous verrons comment il interagit avec le Contenu classe que nous venons de créer.

auteur = 'Tom McFarlin';  post de fonction publique ($ content) $ this-> format_content ($ content); 

La classe semble petite, non? Il n'y a pas de propriétés - car il les hérite de la Contenu classe - et il n'y a que deux fonctions, dont l'une est unique à la classe - poster.

Notez que dans le constructeur, nous faisons d’abord un appel au constructeur parent en utilisant le :: opérateur. Vous pouvez lire beaucoup plus à ce sujet dans le manuel, mais il suffit de dire que l'opérateur est réservé pour faire référence à un certain nombre d'éléments différents en dehors de la classe dans laquelle il est défini. Dans notre cas, c'est l'appel au constructeur du parent.

Ensuite, j'ai choisi de définir mon nom en tant qu'auteur du message. Notez que j'utilise le $ this mot-clé. Comme la sous-classe hérite des propriétés de son parent, elle peut faire référence à ces propriétés et si elles ont été définies en son sein..

Notez que cela est possible non seulement parce que Post étend le contenu mais parce que la propriété est marquée comme protégé dans Contenu, ainsi que. Si elle était marquée comme privé, ce ne serait pas possible.

Le deuxième enfant

Maintenant que nous avons créé le Poster classe, nous avons aussi le Commentaire classe qui, rappelons-le, représente une personne qui a laissé un commentaire sur un article. S'il s'agissait de ce code au niveau de la production, il y en aurait beaucoup plus: nous devrions associer un commentaire à un article, déterminer si un commentaire est une réponse à un commentaire existant, marquer le statut d'un commentaire, etc..

Mais dans le but de démontrer héritage, nous laissons tout cela de côté et nous concentrons uniquement sur les choses qui peuvent conduire les concepts.

save ('John Doe', $ comment); 

Comme vous pouvez le voir, le Commentaire le code n'est pas très différent de la Poster code. Dans une certaine mesure, cela est positif car cela montre que nous avons extrait les pièces appropriées dans notre classe de base.. 

Quoi qu’il en soit, notez qu'après la construction du Commentaire, nous faisons appel au constructeur parent. Ensuite, nous définissons le ajouter méthode chargée de prendre le commentaire entrant, puis de l'enregistrer en transmettant l'auteur du commentaire et son contenu à la enregistrer méthode.

La bonne chose est que le enregistrer Cette méthode est déjà définie dans la classe de base, qui gère également toute la mise en forme via l’utilisation d’un privé fonction, donc nous gagnons cette fonctionnalité que nous créons notre classe enfant.

Travailler avec l'exemple

Ceci fait, voyons quelques exemples pour montrer l’assemblage des pièces. Pour vous assurer que ce code est exécuté, il vous suffit d’un serveur Web, d’un répertoire d’exécution des scripts PHP et d’un éditeur de texte..

Tout d'abord, nous allons créer une instance de Contenu et ensuite, nous appellerons une instruction de débogage afin de voir ce qui constitue une instance de la classe..

$ content = new Content (); var_dump ($ content);

Si tout fonctionne correctement, vous devriez voir tout ce qui précède.

Ensuite, allons-y et créons un article. Puisque nous plaçons toutes les informations dans le contexte de la classe, tout ce que nous avons à faire est d’appeler une fonction sur la classe afin d’afficher les informations..

Par exemple:

$ post = new Post (); echo 'L'auteur du post est:'. $ post-> get_author ();

Encore une fois, puisque nous avons tout mis en place dans le code lui-même, le simple appel de la méthode montre le concept.

Enfin, nous pouvons créer un Commentaire, appeler le ajouter méthode sur une instance de la classe, essayez de passer du code malveillant (seulement pour le voir dépouillé par notre code). Si tout se passe bien, vous devriez voir ce qui suit:

$ comment = new Comment (); $ comment-> add (''); echo 'Le commentaire se lit comme suit:'. $ comment-> read ();

Et c'est tout: notre simple démonstration d'héritage.

Héritage dans WordPress

Pour ce qui est de l'héritage dans WordPress, la toute première chose qui me vient à l'esprit - et probablement d'autres développeurs - est l'API Widgets. La raison pour laquelle je dis que c'est parce que l'API est alimenté par l'héritage.

Bien sûr, les widgets peuvent être créés sans utiliser l'API, mais je dirais que c'est une erreur de développement. Pourquoi vous compliquer la tâche alors qu’il existe déjà une fondation pour le faire? Mais je m'égare.

La bonne chose à propos de cette API particulière est qu'elle met en valeur tous les points forts de la programmation orientée objet et de l'héritage au travail. Par exemple, voici un exemple de code extrait directement du Codex:

Maintenant que nous avons couvert le modèle conceptuel, examiné les mots-clés et la méthodologie, rédigé notre propre code et créé notre propre exemple, nous devrions pouvoir le suivre relativement facilement..

Mais voici la chose: l’un des meilleurs moyens d’améliorer l’écriture de tout type de code est de mettre continuellement en pratique les concepts. C’est-à-dire explorer les idées écrites par d’autres personnes qui ont fait des choses plus avancées que vous dans des travaux antérieurs.

Exemple, jetez un coup d’œil au premier exemple fourni dans le Codex WordPress. Et si vous travaillez avec une version ultérieure de PHP qui prend en charge des fonctionnalités telles que les espaces de noms (sujet légèrement plus avancé), consultez également le deuxième exemple..

Plus vous révisez le code et le corrigez, plus vous en apprendrez davantage. Mais aller plus loin que cela dans cet article va nous sortir du champ de la série entière.

Jusqu'à la fin

À ce stade, nous avons couvert l’ensemble du matériel de débutant nécessaire pour jeter les bases d’un guide du débutant pour l’écriture de PHP orienté objet. Dans le dernier article, nous fournirons un résumé de tout ce que nous avons couvert afin que nous ayons une référence unique pour les grandes idées pouvant être ajoutées aux favoris, sauvegardées ou référencées ultérieurement..

De plus, nous aurons une courte période de discussion sur une série de suivi, mais nous le garderons jusque-là..

Pour l'instant, si vous avez des questions, des commentaires et / ou des commentaires sur le contenu, le code ou les exemples ci-dessus, n'hésitez pas à le faire dans la section commentaires ci-dessous..