Comment utiliser le mode decorator en PHP

Au fur et à mesure que nous progressons dans lrsquoapprentissage de la programmation orientée objet (oop) en tant que développeurs PHP, lrsquoutilisation de certains modèles établis devient plus importante, tout comme le modèle decorator que jrsquoai récemment utilisé. Au niveau du manuel, le schéma decorator nous permet de le modifier au moment de lrsquoexécution de la classe, tandis que lrsquoextension de la classe nous permet de le modifier au moment de la conception. Cette différence peut sembler insignifiante, mais elle a un impact important sur la lisibilité et lrsquoextensibilité de lrsquoapplication. Le schéma decorator est une autre façon drsquoajouter des fonctionnalités à une classe. Au lieu drsquoutiliser lrsquohérédité pour lrsquoétendre, nous avons créé une nouvelle classe qui est
Voici un exemple rapide drsquoune classe de post représentant un événement qui modifie un post WP: Position = $position
}
* *
Obtenir la date de lrsquoévénement
* *
Chaîne de retour
*
Get _ Event date () {fonctions publiques
Retourner get _ post Meta ($this gt post gt ID,
}
Le constructeur de cette classe accepte lrsquoobjet WP _ Post, donc nous avons ajouté une méthode pour obtenir la date de lrsquoévénement à partir du métachamp. Nous avons maintenant un objet déclaratif simple pour représenter la date de lrsquoévénement.
Le schéma decorator est logique ici, plutôt que drsquoétendre la classe WP _ post. Lrsquoune des raisons est subjective: Je pense qursquoil est préférable de séparer les tâches de requête et de mise en cache de WP _ post de celles de cette catégorie: la date à laquelle lrsquoévénement a été obtenu. Une autre raison est réaliste. WP _ post est déclaré par le mot clé final. une classe est déclarée avec un mot clé final, il nrsquoest pas possible de la Sous catégoriser. Les motifs décoratifs offrent une solution à ce problème. je veux créer une classe pour un type particulier de post WordPress, je ne peux pas étendre WP _ post parce que
Crsquoest la dernière leçon. Mais je peux le décorer.
Abonnement à lrsquointerface {
Get _ Length () fonction publique: int
Get _ plan () fonction publique: chaîne
}
Abonnement à la classe
* *
Var EDD u subscription
*
$abonnements protégés
Fonction publique _ construction (EDD Subscription $Subscription)
{Y}
$this gt Subscription = $Subscription
}
Get _ Length () fonction publique: int
{Y}
À faire
}
Get _ plan () fonctions publiques: chaîne
{Y}
À faire
}
}
Classe drsquoabonnement
* *
Var Woo _ subscription
*
$abonnements protégés
Fonction commune _ construction (abonnement $abonnement)
{Y}
$this gt Subscription = $subscription
}
Get _ Length () fonction publique: int
{Y}
À faire
}
Get _ plan () fonctions publiques: chaîne
{Y}
À faire
}
} la comparaison entre la décoration et les sous classes, car crsquoest la seule option, ce nrsquoest pas la seule raison pour laquelle nous utilisons des motifs décoratifs plutôt que des sous classes. Souvent, lorsque jrsquoécris du Code propre au site pour mrsquointégrer à drsquoautres plug ins, jrsquoétends leurs classes au lieu drsquoutiliser le schéma de décorateur le plus approprié.
Par exemple, voici une classe actuellement utilisée sur calderaforms. Com, pour enregistrer et invoquer notre champ de paiement personnalisé qui demande au client srsquoil achète un plug in pour lui même ou pour le client: Mise à jour _ Meta (self:: Organisation mondiale de la santé for Meta Key, $WHO)
$this gt add _ note (
}
* *
* Découvrez si crsquoest pour moi ou pour un client
* *
Chaîne de retour
*
Fonction publique get _ who for (): String
{Y}
$Chi = $this gt get _ Meta (self:: WHO for Meta key)
(NULL ($Chi) | | is _ String ($Chi) {
$who = lsquoCustomerrsquo
}
Renvoie $Chi
}
Cette classe étend le paiement EDD en lisant et en écrivant ces données. Ça marche, mais je nrsquoaime pas ce code.
Eh bien, je lrsquoai réécrit comme un décorateur. Ceci illustre la différence: Nombre de pages
To = $payment
}
* *
Destinations clés où nous stockons nos clients ou mes objets de paiement
*
Const World Health Organization _ for Meta key =
* *
Inscrivez qui est payé en dollars
* *
* @ Param string $Chi indique qui crsquoest. Valeurs valides: me | client
*
Fonction publique set _ who for (String $who = lsquoclientrsquo)
{Y}
(! In _ array ($Chi

« client»
()
) {
$who = lsquoCustomerrsquo
}
$this gt payment gt update _ Meta (self:: World Health Organization for Meta Key, $WHO)
$this gt payment gt add _ note (
}
* *
* Découvrez si crsquoest pour moi ou pour un client
* *
Chaîne de retour
*
Fonction publique get _ who for (): String
{Y}
$who = $this gt payment gt get _ Meta (self:: WHO for Meta key)
(NULL ($Chi) | | is _ String ($Chi) {
$who = lsquoCustomerrsquo
}
Renvoie $Chi
}
Les paiements EDD sont maintenant considérés comme une dépendance. Cela signifie que la classe de paiement a un emploi. Le respect du principe de responsabilité unique ne vise pas seulement à obtenir de « bons points de codage ». Dans ce contexte, nous avons obtenu des résultats tangibles.
Crsquoest plus facile à lire maintenant parce que nous nrsquoavons pas à nous soucier de comprendre les parents. De plus, il est plus facile de modifier lrsquoanalogie de la décoration pour lrsquoétendre à drsquoautres classes. Tout à cette échelle est insignifiant. Mais à mesure que la complexité de la fonctionnalité personnalisée augmente, la classe représente en fait un contenu très différent de celui sur lequel elle est basée. Par exemple, dans Caldera forms pro, un produit SaaS partiellement intégré dans WordPress, le logiciel utilise des téléchargements numériques simples pour le commerce électronique. Dans ce code, jrsquoa I une classe drsquoabonnement qui décore la classe drsquoabonnement EDD U. Jrsquoai pris cette décision de conception pour plusieurs raisons. Tout drsquoabord, mon objet drsquoabonnement fonctionne très différemment de la classe drsquoabonnement EDD U. Je ne crée pas drsquoabonnement ou de base de données.
Obtenez des renseignements de base sur les clients et des métadonnées propres à mon application.
Bien que jrsquoaime compter sur des téléchargements numériques faciles, cela peut changer, ou je peux ajouter drsquoautres façons de créer des abonnements. nécessaire, je peux utiliser la même méthode commune pour créer différentes classes et décorer différents objets. Ils sont interchangeables avec le monde extérieur, mais complètement différents en classe. Ces approches communes clés devraient être définies dans les interfaces mises en œuvre par les deux parties. Voici un exemple de la façon de rendre la logique interne invisible. Jrsquoa I une interface drsquoabonnement et deux classes qui lrsquoimplémentent. Un abonnement à la décoration Woo _ et un abonnement à la décoration EDD abonnement
Abonnement à lrsquointerface {
Get _ Length () fonction publique: int
Get _ plan () fonction publique: chaîne
}
Abonnement à la classe
* *
Var EDD u subscription
*
$abonnements protégés
Fonction publique _ construction (EDD Subscription $Subscription)
{Y}
$this gt Subscription = $Subscription
}
Get _ Length () fonction publique: int
{Y}
À faire
}
Get _ plan () fonctions publiques: chaîne
{Y}
À faire
}
}
Classe drsquoabonnement
* *
Var Woo _ subscription
*
$abonnements protégés
Fonction commune _ construction (abonnement $abonnement)
{Y}
$this gt Subscription = $subscription
}
Get _ Length () fonction publique: int
{Y}
À faire
}
Get _ plan () fonctions publiques: chaîne
{Y}
À faire
}
} mieux encore, le reste du programme ne se préoccupe pas de la différence entre la façon dont woocommerce et Easy Digital s traitent les abonnements. Cette logique devient une boîte noire. Cette façon drsquoimplémenter le schéma et lrsquointerface du décorateur permet au projet de srsquointégrer à plusieurs plug ins ou API du même type, tels que les plug ins de commerce électronique, les passerelles de paiement, etc. Plus facile à gérer.
Faiblesse
crsquoest la seule option. Mais les sous classes sont souvent une option, et je ne dis pas que ce nrsquoest pas bon. Je veux dire, il a des inconvénients, et en étudiant une autre option, nous pouvons évaluer ce qui est le mieux dans chaque cas sous classe ou décoration et décider ce qui est le mieux dans ce cas.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

ContactPress Supported By WordPress Plugins