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