web-dev-qa-db-fra.com

Utilisation de fonctions/méthodes de plugin dans les modèles

J'ai créé un plugin en utilisant différentes classes. Je souhaite pouvoir accéder aux méthodes de plusieurs classes à partir des modèles de page de mon thème personnalisé. La méthode que j'utilise actuellement consiste à créer des méthodes statiques, mais je me demande si c'est la meilleure façon de le faire.

Un exemple pourrait être une classe avec une méthode qui vérifie si l'utilisateur est connecté et quel est son rôle d'utilisateur. Appelons la classe Plugin_Access et la méthode has_access();

Maintenant, supposons que je dois personnaliser le contenu dans l'en-tête, le modèle de page et le pied de page à l'aide d'instructions if () basées sur has_access(). Pour ce faire, j'utiliserais if( Plugin_Access::has_access() ). Pour moi, je pense que ce n’est pas la solution la plus propre. J'appelle essentiellement la même méthode et j'obtiens le même résultat 3 fois. S'il y avait un appel à la base de données dans la méthode, il s'agirait de 3 appels plutôt que d'un.

Une solution à laquelle j'ai pensé était de faire de la classe une singleton et de stocker le résultat de la fonction dans une variable de la classe. Ensuite, la méthode vérifiera cette variable et si c'est null, alors complétera le reste de la méthode, sinon, retournera simplement la variable stockée.

Je sens que je manque définitivement quelque chose. Merci d'avance pour tout conseil.

1
Ric

L'optimisation prématurée est la racine de tout mal (ok, perte de temps de programmation). Pourquoi voudriez-vous combien de fois une fonction est appelée? ce n'est pas comme si la mémoire ou le processeur s'affaiblissait en en abusant.

Il est plus important que le code que vous produisez soit auto-documenté autant que possible plutôt que de faire des micro-optimisations. Si cela signifie 3 appels au lieu d'un, alors qu'il en soit ainsi.

Si vous rencontrez un problème de performances parce que la fonction effectue des calculs lourds/lents, la solution consiste à mettre en cache "en interne" les pièces lourdes/lentes.

Note latérale 1. Utilisez les API Wordpress, ne réinventez pas les roues à moins d’avoir effectué des recherches et trouvé d’aucune autre façon, car wordpress fera beaucoup de mise en cache pour vous et votre accès à 3 bases de données ne sera en réalité qu’un seul.

Note latérale 2. Les singletons sont rarement OOP et vous obtiendrez un code beaucoup plus facile à lire et à manipuler, en particulier dans le contexte de wordpress, si vous évitez simplement les classes et utilisez les espaces de noms.

0
Mark Kaplun

Comme vous l'avez compris, cela dépend de ce que fera votre méthode.

Si la méthode doit vérifier dans la base de données pour définir le booléen à renvoyer, comme pour la vérification d'une option, enregistrez sa valeur dans une propriété lors de l'hydratation ou lors du premier appel de la méthode. Cependant, notez que WP met en cache les résultats de la requête tels que get_option() , get_post_meta() , etc ... Donc, dans de tels cas, je ne pense pas qu'il y aurait un avantage ...
Sinon, appelez-le ainsi dans votre modèle sans le stocker dans une propriété.

Si la méthode doit renvoyer un résultat de requête de base de données, il est naturel de stocker le résultat en tant que propriété de votre modèle de domaine objet qui, par définition, ne devrait pas être un singleton.
Dans WP, WP_Post est un exemple de classe de modèle de domaine. Comme vous pouvez le constater, $post->title renvoie un résultat de requête.
Vous hydratez un objet de modèle de domaine lors de son initialisation.

0
ClemC