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

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

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

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.

Без меток

       

Нет загрузок

  

  • Переход на новый движок сайта

    от от 29.12.2015 - 3 Комменты

    Как уже многие заметили, каталог программ HomeSoft перешел на новый движок. Пришлось потрудиться. Вначале долго выбирал КМС (систему управления контентом), хотя выбор скриптов с поддержкой каталога программ и не велик, да и большинство платное. Но это и не главное. Главное поддержка. Некоторые вообще не отвечали на письма. Некоторые просили большие деньги за сам перенос старого […]

  • SciTE - кроссплатформенный текстовый редактор

    от от 20.11.2016 - 0 Комменты

    SciTE (Scintilla based Text Editor, основанный на компоненте Scintilla текстовый редактор) — удобный портативный редактор с подсветкой синтаксиса программ (Си, Дельфи, Шарп, PHP), работающий на операционных системах Windows и Linux и поставляющийся с открытым исходным кодом.

  • FreeArc - бесплатный архиватор

    от от 14.11.2016 - 0 Комменты

    FreeArc — это бесплатная программа с открытым кодом для 32-х битных систем Windows и Linux.

  • PSPad — бесплатный текстовый редактор

    от от 27.11.2016 - 0 Комменты

    PSPad — это бесплатный, небольшой и простой в использовании редактор для текста и исходных кодов программ, работающий под управлением Windows.

  • HandBrake - бесплатный конвектор MPEG-видео

    от от 06.11.2016 - 0 Комменты

    HandBrake — это простая и удобная в обращении программа для сдирания видео с DVD и BLU-Ray дисков, на которых нет защиты от копирования. Является свободным кроссплатформенным программным обеспечением для систем Microsoft Windows, Линукс, Mac OS X и Solaris.