Modèles de conception PHP de base pour les développeurs WordPress
Boucle en temps réel entre l’utilisateur et l’application. Il existe de nombreuses variantes du modèle MVC, mais il comporte généralement trois parties: la vue, le Contrôleur et le modèle.
Une vue ou un modèle définit une représentation visuelle des données en fonction de l’état actuel du modèle et peut être modifié en fonction de l’entrée de l’utilisateur. Un contrôleur est une médiation entre une vue et une source de données ou une API distante. Vous pouvez également mettre à jour le modèle en fonction de vos interactions avec les vues et les API distantes. Le modèle est l’ensemble de données actuel défini par le Contrôleur et affiché par la vue. En général, une application, un cadre ou un langage utilisant une architecture MVC est plus difficile à comprendre qu’une application, un cadre ou un langage utilisant une architecture basée sur des événements. Ce n’est ni \
Certains des cadres créés sur WordPress implémentent le modèle MVC. C’est bien lorsqu’ils s’adaptent à des besoins spécifiques, mais il est important de se rappeler qu’ils sont des MVC sur une architecture axée sur les événements. Modèles de conception PHP utiles l’architecture basée sur les événements de WordPress n’est pas en soi un modèle logiciel. Mais il est implémenté en utilisant la variante éditeur \/ abonné du mode observateur. Il ne correspond pas toujours parfaitement aux définitions manuelles de ces modèles, mais cela n’a vraiment pas d’importance. Apprendre ou utiliser des modèles de conception PHP pour ce logiciel ne signifie pas que vous avez une connaissance impressionnante du sujet ou de l’application de cette connaissance. Au lieu de cela, comprendre ces modèles signifie vous aider à les utiliser au bon moment et savoir s’ils sont la bonne solution au problème.
Il peut également aider à lire le Code d’autres personnes, ce qui est important pour améliorer vos compétences et vous aider à intégrer ou à déboguer le Code. L’identification d’un modèle de conception PHP commun peut vous aider à comprendre le Code que vous regardez. Non.
Ce sont des modèles de conception de logiciels. J’aimerais plutôt étudier deux modèles formels importants pour les développeurs WordPress. Je voudrais également parler de quelques modèles informels, mais ils sont largement utilisés dans WordPress. Le modèle monopièce est très courant dans le développement de logiciels et de plug – ins WordPress, mais il peut être abusé dans le développement de plug – ins WordPress.
L’essentiel du modèle Singleton est de s’assurer qu’il n’y a qu’une seule instance de la classe qui l’implémente. En PHP, par défaut, n’importe quelle classe peut être instantanée n’importe quel nombre de fois. Dans la plupart des cas, c’est bien parce qu’il vous permet de créer plusieurs objets avec la même structure en utilisant des classes qui représentent des données différentes. Mais qu’en est – il des classes conçues pour charger des plug – ins ou des applications? Pourquoi deux fois? Vous n’avez peut – être besoin que d’une seule instance de cette classe. Ou, qu’en est – il de la construction d’une classe qui contient des objets configurés par un plug – in ou une application? De même, un seul exemple de cette classe est significatif.
Vous n’avez besoin que d’une instance de la classe, suivie d’un nom. Singleton fonctionne en déclarant le générateur de classe privé ou protégé. Dans ce modèle, des variables statiques privées ou protégées sont utilisées pour contenir des instances de la classe. La variable est ensuite récupérée en utilisant une méthode statique commune. Avant d’effectuer cette opération, vérifiez que la variable est nulle et, si elle est nulle, créez une instance de la classe et stockez l’Instance dans la variable. Voici un exemple: <?php
classe singleton_example {
/**
* Contiene l'istanza di classe
*
* @accesso privato
*
* @var singleton_example
*/
$instance statica privata;
/**
* Costruttore privato per prevenire nuove istanze.
*/
funzione privata __construct(){
//sentiti libero di fare cose che dovrebbero accadere solo una volta qui.
}
/**
* Ottieni istanza di classe
*
* @return singleton_example
*/
funzione statica pubblica get_instance(){
if( null === self::$istanza ){
self::$istanza = nuovo self();
}
return self::$instance;
}
} A causa del costruttore privato, non puoi accedere a questa classe usando la nuova parola chiave in questo modo:
$oggetto = new singleton_example(); Ciò farebbe sì che PHP chiami un metodo privato, che è illegale. Invece, otterresti la singola istanza usando il metodo get_instance(): $oggetto = singleton_example::get_instance(); Ora la variabile $oggetto contiene l'istanza della classe e puoi usarla per chiamare metodi non statici di quella classe. L'esempio sopra è abbastanza tipico per WordPress poiché supporta PHP 5.2. In alcuni casi, potresti voler sottoclassare una classe che implementa il modello singleton. Non ci sono molti casi in cui vorresti farlo, ma puoi usare associazioni statiche tardive:
<?php
classe singleton_example_two {
/**
* Contiene l'istanza di classe
*
* @accesso protetto
*
* @var singleton_example_two
*/
$instance statica protetta;
/**
* Costruttore protetto per prevenire nuove istanze.
*/
funzione protetta __construct(){
//sentiti libero di fare cose che dovrebbero accadere solo una volta qui.
}
/**
* Ottieni istanza di classe
*
* @return singleton_example
*/
funzione statica pubblica get_instance(){
if( null === statico::$istanza ){
static::$instance = new static();
}
return static::$instance;
}
} Questo esempio è simile ma utilizza la variabile di istanza protetta. Sostituisce anche la parola chiave self, con la parola chiave static per garantire che PHP si riferisca all'istanza corrente, non all'istanza padre durante la sottoclasse.
Tieni presente che i singleton hanno molti svantaggi e sono abusati in WordPress. Questo non li rende cattivi, ma fai attenzione. Un singleton spesso ha senso per la classe di un plug-in responsabile del caricamento di un plug-in. Votre plug – in peut avoir besoin d’une seule instance d’une classe, mais d’autres plug – ins qui s’intègrent à votre plug – in ou à un ajout à votre plug – in peuvent avoir besoin de leur propre instance. En général, les plug – ins WordPress ont une classe principale et une classe séparée qui ajoute des instances de beaucoup d’autres classes, comme pr
Propriété Cela leur permet d’éviter plusieurs singletons tout en leur donnant l’avantage d’accéder facilement à des instances spécifiques d’une classe particulière. Un autre cas d’abus de Singleton est qu’il n’y a aucune raison fonctionnelle d’instancier une classe plusieurs fois, mais il n’y a aucune erreur à le faire. Souvent, ces classes ne représentent pas vraiment des objets de données, mais plutôt des collections de fonctions connexes. Déclarer toutes les méthodes de ces classes statiques simplifie considérablement le travail. Pattern Factory n’est pas largement utilisé dans WordPress, mais il est compréhensible qu’il puisse générer des systèmes explicitement complexes avec de nombreuses classes indépendantes. La classe qui implémente le modèle d’usine est utilisée pour construire des objets ou d’autres objets dans une classe. C’est pour ça qu’on appelle ça une usine. Voici un exemple simple d’usine qui montre comment elle fonctionne. Cette usine de base est utilisée pour construire une instance de la classe wp \ u post de plusieurs façons: la classe post \ u Factory {
\/ * *
Var WP _ post
* \/
$protection tardive;
Fonction publique construction ($post = null) {
Si (IS _ A ($Post, $WP post)) {
$this – > publish = $publish;
} ElseIf (IS _ Numerical ($post) | | is a ($Post, ‘stdclass’) {
$u post = get _ Post ($post);
Si (IS _ Object ($post) {
$this – > publish = $ \ publish;
}
Autres {
$this – > Post = get _ Post ();
}
}
Get _ Post () {fonctions publiques
Retourner $this – > Post;
}
} Il s’agit d’un exemple très simple et peut – être d’une méthode trop complexe pour s’assurer que la variable est en fait un WP _ post. Cela signifie qu’il limite la nécessité de répéter le Code de validation n’importe où, tout en veillant à ce que l’objet WP _ Post, l’ID post ou les paramètres de requête WP représentent réellement l’objet WP post. Encore une fois, c’est trop simple, pas vraiment utile et montre les inconvénients du modèle d’usine. Frais généraux ex
Ça ne vaut peut – être pas la peine. Cependant, comme le montre cet exemple, il peut être utilisé pour introduire la validation des entrées, ce qui peut être utile. Carl Alexander a un excellent article sur la conception d’une classe pour gérer les messages WordPress qui vaut la peine d’être Lu lorsque vous pensez à une telle usine. Mais dans de nombreux cas, cela peut en valoir la peine, ce qui est une bonne façon de créer un système qui crée plusieurs parties d’une application à partir d’une seule configuration. Par exemple, lorsque nous ajoutons des paramètres d’api rest ou un ensemble de routes, nous définissons généralement des champs pour ces paramètres dans la classe qui gère les routes auxquelles ils appartiennent. Et si on avait besoin de cette configuration ailleurs? Que faire si nous voulons injecter cette configuration dans le générateur de paramètres et d’autres générateurs? Nous utiliserons alors une usine ou une autre usine. J’ai récemment publié un générateur de paramètres API WordPress rest qui implémente un modèle d’usine. Bien qu’il soit utile en soi, je développe également une bibliothèque pour utiliser la même configuration, mais il va créer une interface générée par le tronc en utilisant ces paramètres. Étant donné que la configuration est strictement liée au Code, j’espère qu’elle s’adaptera à la génération d’interfaces utilisateur angulaires et, une fois finalisée, à l’adoption des spécifications de l’API de terrain. Un autre endroit où une usine peut être utile est le plug – in. Les plug – ins ont généralement des add – ons similaires, utilisent les mêmes crochets et utilisent beaucoup de code répétitif. Une utilisation du modèle d’usine est de définir automatiquement tous ces crochets. Une des raisons pour lesquelles WordPress Core global utilise des modèles de conception PHP Singleton est qu’il évite d’utiliser des variables globales pour stocker des instances de classes. Un seul exemple introduit l’état global de la classe dans l’application sans ut
Utilisez des variables globales. Les variables globales PHP sont entièrement modifiables. Ils peuvent être désactivés ou redéfinis à tout moment. Nous sommes tous d’accord pour ne jamais changer la variable globale $post dans WordPress en un tableau, mais nous pouvons le faire. Il n’est pas illégal de changer global $post en un tableau aléatoire ou d’annuler sa propriété post _ title. La prochaine fois que vous vous connectez, un problème apparaît, peut – être une erreur fatale. WordPress Core n’utilise pas d’instance unique. Je ne suis pas sûr, mais c’est peut – être le produit de WordPress et de son prédécesseur B2 \/ cafelog avant que PHP n’introduise des attributs statiques. Au lieu de cela, WordPress insère de nombreuses instances de classe dans des variables globales. Ces classes ont souvent un générateur commun. Dans le cas de WP _ Rewrite, il est étroitement lié à la règle de réécriture sauvegardée et vous n’avez peut – être pas besoin d’autres instances de WP Rewrite que Wp Rewrite dans Global $WP Rewrite. Si WordPress a été écrit aujourd’hui, wp \ u Rewrite pourrait implémenter le mode Singleton. Au lieu de: Global $wp \ u Rewrite;
$WP _ Rewrite – > Flush Rules (); Nous pouvons utiliser: WP _ Rewrite:: get instance () – > Flush Rules (); Mais il peut s’agir d’une surutilisation des modèles de conception PHP Singleton, il peut y avoir une classe WordPress primaire qui a un Singleton et contient des instances telles que Wp _ Rewrite, wpdb, WP rest Server, etc. Global $wp \ u override est une dette purement technique qui se produit lorsque le projet a plus de dix ans et promet de ne pas compromettre la rétrocompatibilité. Permettez – moi de préciser qu’à mon avis, plus « techniquement correct» ne vaut pas la peine de détruire presque tous les sites WordPress. Il est logique d’utiliser des variables globales dans wordpress pour les classes qui ont une \
Requête principale basée sur la requête courante. Cela nous permet d’invoquer l’Instance de requête WP _ pour la requête courante et de créer notre propre instance de requête WP pour d’autres requêtes. Si WP _ Query utilise un seul exemple, nous devrions écrire une requête SQL chaque fois que nous avons besoin d’exécuter plusieurs requêtes sur des messages dans la même requête, ce qui serait très mauvais. Oui, il y a une meilleure façon de stocker la requête principale, si votre cadre n’a pas plus de 10 ans de stockage, nous l’appelons la requête principale. Je veux dire, ne lâche pas WordPress. Mon point de vue est d’identifier un modèle que nous devrions voir car il nous aide à comprendre WordPress. De plus, il nous aide à comprendre comment nous pouvons faire mieux au travail. Pourquoi? Encore une fois, il ne s’agit pas d’impressionner vous – même ou vos amis sur la capacité d’identifier et de mettre en œuvre des modèles de conception PHP communs. Aucun utilisateur final ne se rendra sur le site WordPress et sera impressionné par l’utilisation économique mais raisonnable du modèle Singleton ou par la mise en œuvre du cadre MVC quelque part dans la pile. Cependant, si apprendre à reconnaître ces modèles peut vous aider à mieux comprendre ce qui se passe dans le Code de quelqu’un d’autre que vous devez utiliser, ou vous aider à écrire un meilleur Code, ou mieux conceptualiser le système que vous utilisez, vous devriez être en mesure de faire des progrès en tant que développeur.