Нет, вы не можете «инициализировать» или создать экземпляр класса с помощью хука, а не напрямую. Всегда требуется некоторый дополнительный код (и это нежелательно, когда вы открываете банку с червями для себя).
Вот лучший способ сделать это:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Конечно, можно создать интерфейсный класс, чтобы упростить его для общего случая еще дальше:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Обратите внимание, что в качестве интерфейса вы не можете создать объект этого типа напрямую, но вы можете создать подкласс, позволяющий вам сказать:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Который затем автоматически добавит все хуки, вам просто нужно определить, что именно делается в подклассе, а затем создать его!
На конструкторах
Я бы не добавил конструктор в качестве функции ловушки, это плохая практика и может привести к множеству необычных событий. Также в большинстве языков конструктор возвращает объект, для которого создается экземпляр, поэтому, если вашему хуку нужно вернуть что-то похожее на фильтр, он не вернет отфильтрованную переменную, как вы хотите, а вместо этого вернет объект класса.
Вызов конструктора или деструктора - очень, очень, очень плохая практика программирования, независимо от того, на каком языке вы находитесь, и никогда не следует делать это.
Конструкторы также должны создавать объекты, чтобы инициализировать их готовыми к использованию, а не для реальной работы. Работа, которую должен выполнить объект, должна быть в отдельной функции.
Методы статического класса, и не нужно вообще создавать / инициализировать
Если ваш метод класса является статическим методом класса, вы можете передать имя класса в кавычках, а не $this
как показано ниже:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Закрытия и PHP 5.3
К сожалению, вы не можете избежать линии, создающей новый класс. Единственное другое решение, чтобы пропустить это, включало бы код котельной пластины, который все еще имеет эту строку, и потребовал бы PHP 5.3+, например:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
В этот момент вы можете также пропустить класс и просто использовать функцию:
add_action('admin_init',function(){
// do stuff
});
Но имейте в виду, что вы сейчас представили призрак анонимных функций. Нет способа удалить вышеуказанное действие с помощью remove_action
, и это может и действительно причиняет большую боль разработчикам, которые должны работать с кодом других людей.
На амперсандах
Вы можете увидеть действия, используемые следующим образом:
array( &$this, 'getStuffDone' );
Это плохо . &
был добавлен обратно в PHP 4, когда объекты передавались как значения, а не как ссылки. PHP 4 более десяти лет, и WordPress не поддерживался в течение очень долгого времени.
Там нет никаких оснований для использования &this
при добавлении крючков и фильтров, и удаление ссылки не вызовет никаких проблем, и может даже улучшить совместимость с будущими версиями PHP
Используйте это вместо:
array( $this, 'getStuffDone' );
$class
качестве имени переменной, эти слова, как правило, зарезервированы. Я думаю, что вы стараетесь изо всех сил избегать говорить что-то подобное$x = new Y();
в глобальной области, и вы добавляете сложность там, где ничего не нужно. Ваша попытка уменьшить количество написанного кода повлекла за собой написание большего количества кода!add_action( 'admin_init', array('MyNamespace\MyClass','getStuffDone' ) );
Пример класса
Заметки:
! class_exists
чтобы не вызывать его дважды, и поместите инициализатор внутриinit
функцию и класс varstatic
new self
.Вот пример
Php 5+
Пожалуйста , оставьте
&
вне. Мы уже за php4. :)источник
источник
Вы можете запускать события в своем классе без необходимости загружать его изначально . Это удобно, если вы не хотите загружать весь класс заранее, но вам нужен доступ к фильтрам и действиям WordPress.
Вот очень простой пример
Это очень упрощенная версия ответа Кайзера, но демонстрирующая простым языком поведение. Может пригодиться тем, кто смотрит на этот стиль впервые.
Другие методы могут при необходимости инициировать объект. Я лично использую этот метод, чтобы разрешить дополнительным частям моего плагина ставить в очередь сценарии, но только вызывать объект по запросу AJAX.
источник
Это работает для меня:
источник
Вообще говоря, вы не добавили бы целый класс к крючку. В
add_action()
/add_filter()
Крючки ожидают обратного вызова функции , которые могут быть ссылки из внутри класса .Допустим, у вас есть
init()
функция внутри вашего класса, которую вы хотите подключить к крюку WordPressinit
.Поместите ваш
add_action()
вызов в ваш класс, а затем определите обратный вызов следующим образом:(Примечание: я предполагаю, что ваш класс правильно пространства имен; в противном случае, убедитесь, что пространство имен ваших функций обратного вызова.)
источник
init
(или там, где вам это нужно)?Вы должны быть в состоянии сделать это, передавая имя класса вместо экземпляра объекта:
(Теоретически, ваше другое решение должно работать
Не уверен с головы, почему это не так. Может быть, если вы не позвоните по ссылке?)
источник
init
метод. См. Wordpress.stackexchange.com/a/48093/14052