Добро пожаловать, гость! [ Вход

Разместить программу

Рекомендации по правильной инициализации или созданию экземпляров классов плагинов

Wordpress 05.07.2022

Начав изучать Вордпресс, углубляясь в чужие исходники, обращал внимание что некоторые авторы используют классовые синглтоны. Это было для меня не понятно. Ну ладно в обычной программе, но на вебсайте-то зачем? Ан нет, оказалось есть причина.

Итак код (далее коды не мои):

<?php

class Badly_Designed_Plugin {

  public function __construct() {
    add_action( 'woocommerce_after_my_account', array( $this, 'display_something_useless' ) );
  }

  public function display_something_useless() {
    echo "I am a very badly designed plugin!";
    echo "I will make people sad.";
  }

}
new Badly_Designed_Plugin();

Так что не так с этим кодом? Я так и пишу свои первые плагины. Но вот знатоки пишут что невозможно будет удалить функцию display_something_useless() из действия ‘woocommerce_after_my_account’. (в принципе есть кривой способ сделать это тут ).

Обычно это делается так:

remove_action(
  'woocommerce_after_my_account', 
  [$instance_of_badly_designed_plugin, 'display_something_useless']
);

Однако у нас нет возможности получить доступ к экземпляру класса Badly_Designed_Plugin. При создании экземпляра класса:

new Badly_Designed_Plugin();

… он создан и просто оставлен болтаться в пустоте без ссылки на него. Не делайте этого.

Вместо этого, если ваш класс должен иметь один экземпляр, просто используйте Singleton.

Пример:

<?php

class Nicely_Designed_Plugin {

  private static $instance;

  public static function get_instance() {
    if (null === static::$instance) {
      static::$instance = new static();
    }
        
    return static::$instance;
  }

  protected function __construct() {
    add_action( 'woocommerce_after_my_account', array( $this, 'display_something_useless' ) );
  }

  public function display_something_useless() {
    echo "I am a very nicely designed plugin.";
    echo "If someone wants to customize me, they can do it!";
  }

}
Nicely_Designed_Plugin::get_instance();

Теперь вызов Nicely_Designed_Plugin::get_instance() всегда будет возвращать один и тот же экземпляр Nicely_Designed_Plugin — экземпляр, привязанный к этому действию WooCommerce.

Итак, чтобы избавиться от этого бесполезного действия, я могу сделать следующее:

$instance_of_badly_designed_plugin = Nicely_Designed_Plugin::get_instance();
remove_action(
  'woocommerce_after_my_account', 
  [$instance_of_badly_designed_plugin, 'display_something_useless']
);

Итак, синглтоны не являются злом по своей сути. Они злы, если используются в неправильном контексте. Небольшой плагин WordPress — идеальное место для использования Singleton.

Без меток

       

Нет загрузок

  

Рекламные ссылки

Рекламный блок