Intereting Posts
Добавление параметра в цикл продуктов woocommerce Проблема с версией PHP? Основные сообщения электронной почты WP Тема с неправильным обновлением Как переключить пользовательский список архивов WP Разрешено ли использовать стиль отступа Allman (BSD) при кодировании плагинов и тем WordPress? Как отобразить раскрывающийся список «Почтовые имена» Как создать неповторимые пули подкатегорий? Как добавить метасимвол по умолчанию для предотвращения ошибки? Как WordPress генерирует URL-пули? Woocommerce Установите ставку налога на уровне корзины Одноразовое имя пользователя меняется с внешнего интерфейса? Есть ли лучший способ перечислить все термины базы данных в алфавитном порядке? Многие пользователи со странными именами регистрируются, но не оставляют комментарии. Должен ли я бояться? Как правильно позиционировать изображения с максимальной гибкостью?

Лучший способ инициировать класс в WP плагине?

Я создал плагин, и, конечно, будучи мной, я хотел пойти с хорошим подходом OO. Теперь то, что я делал, это создать этот класс, а затем чуть ниже создать экземпляр этого класса:

class ClassName { public function __construct(){ } } $class_instance = new ClassName(); 

Я предполагаю, что есть более WP-способ, чтобы этот класс был инициирован, а затем я встретил людей, говорящих, что они предпочитают иметь функцию init() чем функцию __construct() . И аналогичным образом я нашел несколько человек, использующих следующий крючок:

 class ClassName { public function init(){ } } add_action( 'load-plugins.php', array( 'ClassName', 'init' ) ); 

Что обычно считается лучшим способом создания экземпляра класса WP при загрузке и иметь это как глобально доступную переменную?

ПРИМЕЧАНИЕ. В качестве интересной стороны я заметил, что, хотя register_activation_hook() может быть вызван из __construct , он не может быть вызван из init() используя второй пример. Возможно, кто-то может просветить меня по этому вопросу.

Редактирование: спасибо за все ответы, очевидно, что есть довольно дискуссия о том, как обрабатывать инициализацию внутри самого класса, но я думаю, что в целом существует довольно хорошее add_action( 'plugins_loaded', ...); что add_action( 'plugins_loaded', ...); это лучший способ на самом деле оттолкнуть его …

Редактирование: просто для того, чтобы запутать вопросы, я также видел, что это используется (хотя я бы не использовал этот метод сам, потому что превращение красивого класса OO в функцию, похоже, лишило его точки):

 // Start up this plugin add_action( 'init', 'ClassName' ); function ClassName() { global $class_name; $class_name = new ClassName(); } 

Solutions Collecting From Web of "Лучший способ инициировать класс в WP плагине?"

Хороший вопрос, есть ряд подходов, и это зависит от того, чего вы хотите достичь.

Я часто это делаю;

 add_action( 'plugins_loaded', array( 'someClassy', 'init' )); class someClassy { public static function init() { $class = __CLASS__; new $class; } public function __construct() { //construct what you see fit here... } //etc... } 

Более подробный пример, который появился в результате недавних обсуждений по этой теме в чат-комнате, можно увидеть в этом вопросе членом WPSE toscho .

Пустой конструкторный подход.

Вот выдержка из преимуществ / недостатков, взятых из вышеприведенного принципа, который иллюстрирует полный подход к конструктору в полном объеме.

  • Преимущества:

    • Модульные тесты могут создавать новые экземпляры без активации каких-либо крючков автоматически. Нет Синглтона.

    • Глобальной переменной не требуется.

    • Тот, кто хочет работать с экземпляром плагина, может просто вызвать T5_Plugin_Class_Demo :: get_instance ().

    • Легко деактивировать.

    • Все еще реальный ООП: никакие рабочие методы не являются статическими.

  • Недостаток:

    • Может быть, труднее читать?

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


примечание: мне нужно найти пример gist из toscho, который прошел через 3 или 4 сравнения того, как создать экземпляр класса внутри плагина, который просматривал все плюсы и минусы каждого из них, что вышеприведенная ссылка была предпочтительным способом сделать это, но другие примеры обеспечивают хороший контраст с этой темой. Надеюсь, toscho все еще есть в файле.

Примечание . WPSE Отвечайте на эту тему с соответствующими примерами и сравнениями. Также лучшее решение, например, класс в WordPress.

 add_shortcode( 'baztag', array( My_Plugin::get_instance(), 'foo' ) ); class My_Plugin { private $var = 'foo'; protected static $instance = NULL; public static function get_instance() { // create an object NULL === self::$instance and self::$instance = new self; return self::$instance; // return the object } public function foo() { return $this->var; // never echo or print in a shortcode! } } 

Я использую следующую структуру:

 Prefix_Example_Plugin::on_load(); /** * Example of initial class-based plugin load. */ class Prefix_Example_Plugin { /** * Hooks init (nothing else) and calls things that need to run right away. */ static function on_load() { // if needed kill switch goes here (if disable constant defined then return) add_action( 'init', array( __CLASS__, 'init' ) ); } /** * Further hooks setup, loading files, etc. * * Note that for hooked methods name equals hook (when possible). */ static function init( ) { } } 

Заметки:

  • определил место для вещей, которые необходимо запустить сразу
  • отключить / переопределить для твинов легко (отцепить один метод init )
  • Я не думаю, что когда-либо использовал / нуждался в объекте класса плагинов – нужно отслеживать его и т. Д .; это действительно фальшивое пространство имен по назначению, а не ООП (большую часть времени)

Отказ от ответственности Я еще не использую модульные тесты ( так много вещей на моей панели ), и я слышу, что статические могут быть менее предпочтительными для них. Сделайте свое исследование по этому вопросу, если вам нужно его проверить.

Все зависит от функциональности.

Однажды я сделал плагин, который зарегистрировал скрипты, когда был вызван конструктор, поэтому мне пришлось подключить его к wp_enqueue_scripts hook.

Если вы хотите вызвать его, когда загрузится файл functions.php , вы можете также создать экземпляр самостоятельно $class_instance = new ClassName(); как вы упомянули.

Вы можете рассмотреть скорость и использование памяти. Я не знаю никого, но я могу представить, что в некоторых случаях есть невостребованные крючки. Создав свой экземпляр, вы можете сохранить некоторые серверные ресурсы.

Я знаю, что это пара лет, но между тем php 5.3 поддерживает анонимные методы , поэтому я придумал следующее:

 add_action( 'plugins_loaded', function() { new My_Plugin(); } ); 

и как-то мне это нравится больше всего. Я могу использовать обычные конструкторы и не нужно определять какие-либо методы «init» или «on_load», которые испортят мои структуры ООП.