Lors du développement d'un plugin, les fonctions doivent-elles être regroupées dans une classe pour éviter les conflits d'espace de noms?
Oui, mais ce n'est qu'un des arguments mineurs. En fait, ce n'est pas la "vraie" nature d'une classe dans OOAD .
L'utilisation de classes crée-t-elle des frais généraux de performance pour PHP?
Non, pas notamment. Une mauvaise conception et / ou un mauvais code écrit ou une optimisation prématurée créent beaucoup plus de problèmes de performances que les fonctionnalités de langage réelles.
S'il y a un impact sur les performances, les noms de fonction devraient-ils simplement être préfixés à la place?
Comme écrit, il n'y a aucun impact sur les performances. Un mauvais code écrit sera plus un problème de performances qu'un bon code écrit qui a plus de lignes de code mais ne vous oblige pas à faire de mauvaises choses.
Conclusion:
Vous pouvez utiliser différemment les classes pour les plugins. Vous pouvez simplement les utiliser pour avoir une sorte d'espace de noms et les utiliser "juste" pour les fonctions globales. La forme la plus directe en est les fonctions de classe statiques, l'exemple de code suivant montre les deux, d'abord les fonctions globales, puis les fonctions de classe statique globales:
/* global function */
function myplug_hook()
{
}
add_filter('the_hook', 'myplug_hook');
/* global static function */
class myplug
{
public static function hook()
{
}
}
add_filter('the_hook', 'myplug::hook');
Ceci est juste un petit exemple montrant que vous devez taper plus pour le crochet unique. De plus, il montre comment fonctionne l'espace de noms: vous pouvez plus facilement remplacer le nom d'une seule classe pour renommer toutes les fonctions statiques, puis rechercher et remplacer myplug::
ce qui pourrait être plus difficile à myplug_
cause des faux positifs. Mais au final, il n'y a pas beaucoup de différence.
Le point clé est: les fonctions de classe statiques Docs ne sont pas vraiment beaucoup plus que les fonctions globales Docs .
Et cet exemple montre aussi: l'espace de noms est bien, mais avec worpdress, l'espace de noms s'arrête avec l'utilisation de crochets: la fonction de rappel est codée en dur, d'où l'avantage de l'espace de noms en utilisant la classe (un endroit pour le nom de base, le nom de classe) ne le fait pas aide lorsque vous intervenez votre code avec wordpress pour les noms de hook.
Le véritable avantage commence par l'utilisation d'instances de classe réelles et de fonctions non statiques. Cela a l'avantage que vous pouvez commencer à utiliser les principes OO et vous pouvez rationaliser votre code. Les fonctions de classe statiques sont plus un problème qu'une solution en fait.
Ensuite, c'est plus que du sucre syntaxique.
Le point clé est: faites quelque chose qui vous aide à écrire le code que vous pouvez facilement gérer et maintenir. Ne surévaluez pas les performances, c'est une erreur courante. Plus important encore, vous écrivez du code facile à lire et à comprendre, qui fait exactement ce dont vous avez besoin. Peut - être cette question et la réponse est utile pour une image plus grande dans ce contexte: Multiple personnalisé Metabox Aide .
Une approche courante que j'ai même avec des plugins plus petits utilise une fonction d'assistance statique pour instancier le plugin et le reste réside alors dans l'instance du plugin. Cela aide à encapsuler la logique principale du plugin et il bénéficie de l'espace de noms avec les hooks ainsi que les membres privés peuvent être réutilisés entre les hooks, ce qui n'est pas possible avec les fonctions globales standard. L'exemple de code suivant montre le modèle:
<?php
/** Plugin Headers ... */
return MyPlugin::bootstrap();
class MyPlugin
{
/** @var MyPlugin */
static $instance;
static public function bootstrap() {
if (NULL === self::$instance) {
self::$instance = new __CLASS__;
}
return self::$instance;
}
# ...
}
C'est un modèle commun que j'utilise pour le fichier de plugin de base. La classe de plugin représente d'une part le plugin pour wordpress et d'autre part elle permet de commencer à utiliser des paradigmes orientés objet pour le propre code qui peuvent même être complètement orientés objet (mais pas nécessairement). C'est une sorte de contrôleur, s'interfaçant avec l'ensemble de l'API wordpress en tant que demande (s).
Comme le montre l'exemple, une instance du plugin sera créée. Cela vous permet d'utiliser des communs connus comme un constructeur Docs ( __construct
) pour initialiser le plugin réel:
# ...
class MyPlugin
{
# ...
public function __construct()
{
add_filter('the_hook', array($this, 'hook'));
}
public function hook()
{
}
# ...
}
Au moment où le hook est enregistré, cet objet de plugin bénéficie déjà de sa conception: vous avez cessé de coder en dur la fonction de hook réelle par rapport au nom de classe du plugin concret . Cela est possible en raison de la liaison de la classe à l'instance d'objet pour le rappel. Cela semble compliqué, juste dire: $this
c'est le plugin. Peut être utilisé dans les rappels de hook, comparez les méthodes Registering Class comme des rappels de hook .
Ce modèle permet de faciliter l'interface avec wordpress: l'injection est réduite aux noms des hooks et aux données qu'ils fournissent. Vous pouvez ensuite commencer à implémenter directement dans cette classe de plug-in ou à refactoriser votre implémentation par rapport à celle-ci, afin de ne mettre que du code dans la classe de plug-in qui est le strict minimum pour définir votre interface de plug-ins contre wordpress, mais gardez la logique générale en dehors de worpdress. C'est là que le plaisir commence et probablement ce que chaque auteur de plugin veut réaliser à long terme.
Alors ne programmez pas avec inquiétude mais contre elle. Comme worpdress est assez flexible, il n'y a pas d'interface commune ou facile à décrire. Une classe de plugin de base peut assumer ce rôle, vous offrant plus de flexibilité pour votre propre code, ce qui entraînera un code plus facile et de meilleures performances.
Il y a donc plus qu'un simple avantage pour l'espacement des noms. La meilleure suggestion que je puisse donner est: Essayez-vous. Il n'y a pas grand chose à perdre, seulement de nouvelles choses à découvrir.
Vous remarquerez très probablement des différences après avoir passé quelques mises à jour plus importantes de wordpress tout en gardant votre plugin compatible.
Attention : si votre plugin s'intègre directement à wordpress pour faire le travail, l'utilisation d'une ou deux fonctions publiques pourrait vous convenir mieux. Prenez le bon outil pour le travail.