Ні, ви не можете «ініціалізувати» або інстанціювати клас через гачок, а не безпосередньо. Завжди потрібен якийсь додатковий код (і не бажано, щоб це можна було робити, оскільки ви відкриваєте для себе баночку з глистами.
Ось кращий спосіб зробити це:
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
, і це може і справді заподіяти біль для розробників, яким доводиться працювати з кодом інших народів.
На Ampersands
Можливо, ви побачите такі дії:
array( &$this, 'getStuffDone' );
Це погано . &
було додано ще в PHP 4, коли об'єкти передавались як значення, а не як посилання. PHP 4 вже більше десяти років, і він не підтримувався WordPress вже дуже давно.
Немає підстав використовувати &this
при додаванні гаків і фільтрів, а видалення посилання не спричинить жодних проблем і навіть може покращити сумісність з майбутніми версіями PHP
Використовуйте це замість:
array( $this, 'getStuffDone' );