web-dev-qa-db-fra.com

Objets globaux et méthodes publiques

Je développe un plugin et je réfléchis simplement aux meilleures pratiques. Est-il courant d'avoir un objet global? Actuellement sur plugins_loaded je crée un objet global de ma classe:

add_action( 'plugins_loaded', array( 'Test_Plugin', 'init' ) );
...
public static function init() {
    global $testerski;
    $testerski = __CLASS__;
    $testerski = new $testerski;
}

Cela me permet d’utiliser le global $testerski pour appeler des variables ou des méthodes. Est-ce une pratique courante?


Mon autre souci est que, depuis que je crée un objet global et, à ma connaissance, tous les crochets doivent avoir des fonctions publiques pour que WordPress puisse les appeler. Le problème est que je peux appeler ces fonctions destinées aux points d'ancrage à partir de mon objet global. Par exemple, j'ai des hooks enregistrés en tant que:

public function __construct() {
    add_action( 'init',             array( $this, 'test_plugin_setup' )             );
    add_action( 'template_include', array( $this, 'test_templates' )                );
    add_filter( 'cron_schedules',   array( $this, 'test_add_monthly_schedule' )     ); 
}

public function test_templates( $template ) {
    ...
}

Ce que je pourrais appeler techniquement à l’aide de $testerski->test_templates(). Etant donné que cette fonction ne doit pas vraiment être appelée directement et utilisée uniquement pour les hooks, y a-t-il un moyen de l'empêcher d'appeler directement de cette façon? Est-ce que quelque chose comme ceci est dangereux ou suis-je en train de penser?

J'ai remarqué que certains hooks ont des avertissements, tels que wp_enqueue_scripts vous avertira qu'il a été appelé de manière incorrecte.

6
Howdy_McGee

Ce n'est pas une pratique courante, mais cela fonctionne. Une meilleure approche consiste à utiliser une classe et avec le modèle singleton, tout comme WooCommerce et beaucoup d'autres, où vous avez:

  • Une fonction statique (appelée instance, getInstance...) qui:
    • Crée une instance (objet) si ce n'est déjà fait et le renvoie
    • ou renvoie l'instance existante

Continuons avec l'exemple de WooCommerce; nous avions l'habitude de faire cela pour accéder à l'objet global:

global $woocommerce; 

Maintenant nous faisons:

WooCommerce::instance();

# Or with the handy Shortcut
WC();

Je pense que vous aurez plaisir à lire ces:


Vous pouvez vérifier la valeur de current_filter() dans votre méthode, mais si j'étais vous, cela ne me dérangerait pas. Ce n'est pas une menace, et d'autres développeurs voudront peut-être utiliser votre code, alors ne les bloquez pas.

1
Nabil Kadimi