Рекомендации по правильной инициализации или созданию экземпляров классов плагинов
Начав изучать Вордпресс, углубляясь в чужие исходники, обращал внимание что некоторые авторы используют классовые синглтоны. Это было для меня не понятно. Ну ладно в обычной программе, но на вебсайте-то зачем? Ан нет, оказалось есть причина.
Итак код (далее коды не мои):
<?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.
Нет загрузок