web-dev-qa-db-fra.com

Comment traiter des informations globales sans créer de classe singleton

J'essaie de m'éloigner du modèle Singleton lorsqu'il s'agit de développer des plugins pour WordPress.

Pourquoi?

Parce que j'ai lu dans certaines sources ( ici , ici , ici , ICI ...) et est venu avec la conclusion qu'ils sont une mauvaise chose. Ou du moins, pas quelque chose que l'on ne faut utiliser juste parce que.

Pourquoi aurais-je besoin d'un comportement semblable à un singleton?

Parce que je veux avoir un objet avec des propriétés où plusieurs classes le long de différents plugins peuvent écrire et lire ces propriétés.

Et je ne sais sincèrement pas comment aborder cela.

Pouvez-vous s'il vous plaît laissez-moi savoir comment vous le feriez?

Il peut y avoir des cas différents avec différentes solutions, je suppose donc un exemple réel.

exemple :

Un plug-in appelé "exemple exemple" Crée un formulaire personnalisé sur le WordPress site.

Le formulaire est traité via une méthode ajoutée au init crochet par la classe de plug-in.

public static function setup_actions_and_filters(){
   $this_class = new self();
   add_action('init', [$this_class, 'process_form']);
....

Et tout en traitant le formulaire, je voudrais ajouter des messages d'erreur ou de réussite à l'instance active, je peux alors afficher ces messages dans un thème faisant quelque chose comme:

$instance_of_PLUGINCLASS->show_errors();

Mais je n'ai pas accès à l'instance "originale" parce que j'ai appelé une méthode de configuration satic dans le fichier de plugin principal.

PLUGINCLASS::setup_actions_and_filters();

Et c'est pourquoi une solution commune consiste à faire utiliser la plug-comprendre le motif singleton, que je veux éviter.

Est-ce que je suis arrivé avec mes propres idées?

Oui.

Je pensais à:

  • Utilisation de la base de données - une idée horrible
  • Utiliser des cookies - une idée terrible
  • En utilisant des sessions - pas si gentil
  • Passer d'une demande à l'autre envoi d'envoi ou POST Info - vulnérable et sale
  • En utilisant - globaux - J'ai lu plusieurs fois que ce n'est pas une bonne idée de les utiliser
  • Utilisation Cache d'objet WP (voir Caching d'objet Singleton VS )
5
Salamarkesa

Pensé qu'il pourrait être utile de résumer certains des points des commentaires ici. (Remarque: 'Singleton' est un nom donné au modèle de stockage d'une instance d'une classe dans une propriété statique d'une classe, généralement la même chose, donc ici "singleton" et "la propriété statique" sont plus ou moins interchangeables))

Dogme singleton

Il a suivi les bons conseils sur les singletons et les avertissements sur les mauvaises habitudes qu'ils peuvent vous obtenir, mais ne vous laissez pas arrêter d'utiliser des singletons ou des propriétés statiques. Comme en utilisant des variables globales, ou non la structuration de votre code bien dans des fonctions et des fichiers, ou non de la commentaires de votre code ou de nommer de bien vos variables; Ou mille autres autres habitudes de programmation, si vous n'êtes pas au courant des strucutres que vous utilisez et que vous prenez soin de bonnes habitudes de programmation, votre vie (et peut-être la vie des autres peuples) deviendra plus tard.

Il n'y a que 2 options

Sans aller à l'extérieur du PHP processus et sa mémoire, vous avez simplement deux options pour partager des variables entre les champs:

  • Variables globales
  • Propriétés statiques sur les classes.

Il n'y a pas d'autres options. Dans le Wordpress CodeBase, où vous ne pouvez pas modifier la structure des swues de code uniquement pour transmettre votre variable autour de soi, vous devez donc utiliser l'une de ces deux options. La question n'est pas si Mais comment tu les utilises.

En utilisant la complexité appropriée

ICI Mes pensées sur les options de base disponibles. Cela vaut la peine d'envisager lequel d'entre eux a du sens pour vous. Un bon développement sans optimisation prématurée suggérerait que vous devriez utiliser le plus simple qui prend en charge ce que vous connaissez de vos exigences maintenant, avec flexibilité pour modifier votre code si/lorsque vous en avez besoin.

Obtenez créatif, utilisez Wordpress façons

Faire preuve de créativité. Contrôle d'accès au-dessus d'une classe de configuration? Utilisez une array ou une structure de données de file d'attente au lieu d'une seule variable? Employer WordPress filters pour transmettre des valeurs autour et exposez les interfaces d'importation dans votre code vers d'autres utilisateurs?

Certaines petites caractéristiques soignées pourraient vous faire économiser une tonne de chagrin d'amour pour attraper des situations où, par exemple:

  • Vous devez définir une valeur exactement une fois et la lire exactement une fois
  • Vous souhaitez autoriser n'importe quel nombre de valeurs à définir de nombreux endroits différents, puis les lire tous en un seul endroit
  • Vous voulez déboguer en voyant qui définit/obtenir une variable dans quel ordre
  • Vous souhaitez ajouter la mise en cache entre PHP Charges/Sessions de page
  • Vous voulez faire des internes PF votre plugin accessible à d'autres personnes qui peuvent vouloir étendre ses fonctionnalités/contenus
3
mozboz