Почему вам нужно обернуть функцию внутри массива ($ this, function)

8

Я новичок в PHP и WordPress, поэтому, пожалуйста, будьте осторожны!

Я создаю плагин - следую нескольким учебникам, чтобы все заработало.

Мой вопрос: почему функция, которую я хочу вызвать, включена в array($this, function)? Например, у меня есть этот код конструктора внутри моего класса

 function __construct() {
      add_action( 'admin_init',array( $this, 'getStuffDone' ) );
 }

Функция getStuffDone запускается нормально - но почему она должна быть в том формате, в котором она находится?

Любое понимание очень ценится.

Саймон
источник
1
Я не знаю достаточно о ООП, чтобы дать информативный ответ, но некоторые исследования дают несколько хороших ссылок: Использование add_actionс классом и PHP Передача функций
Howdy_McGee
Никогда не регистрируйте обратные вызовы в конструкторах. Это делает ваш код непроверенным.
fuxia
@ toscho ссылка на пример правильной настройки инициализации? Вызвать выделенную функцию init () или что-то из конструктора?
августа
@lkraav Смотрите ответ gmazzap на этот вопрос .
fuxia

Ответы:

6

Это обратный вызов PHP . Вам нужен синтаксис, чтобы сохранить ссылку на экземпляр класса.

Скажем так: если у вас его не было $this, откуда вызывающий узнает, что getStuffDoneэто метод вашего класса, а не просто обычная функция PHP? Это не так.

Использование array( $this, 'getStuffDone' )говорит PHP:

Эй, братан, тебе нужно вызвать метод getStuffDoneв этом экземпляре моего класса

TheDeadMedic
источник
То, что я не понимаю, может быть, как я это читаю, но в первом предложении под Passing говорится except language constructs such as: array(), но здесь мы передаем массив. Это опечатка или я не правильно понял предложение?
Howdy_McGee
Нет, это правильно, но это относится к функциям, а не к методам. Прочитайте пункт прямо под ним.
TheDeadMedic
5

в add_action () определение функции выглядит следующим образом :

 function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
     return add_filter($tag, $function_to_add, $priority, $accepted_args);
 }

так в соответствии с тем, что выглядит так, как он ожидает (строка, строка, int, int)

В традиционном php-файле вторым параметром будет просто одно из имен ваших функций.

так что вы бы add_action('admin_init','my_init_function')

Похоже, вы используете класс для инкапсуляции вашего плагина. Другие классы могут иметь функции с тем же именем ( getStuffDone ).

Таким образом, ваша функция известна только со ссылкой на ваш класс, поэтому вы должны указать свой класс, $thisа также имя функции.

Если вы пытаетесь сослаться на функцию внутри класса, вы должны использовать синтаксис, вызываемый массивом.

Смотрите также codex.wordpress.org

Loopo
источник
1

См. Документацию в разделе « Примечания, внесенные пользователем »:

«Чтобы использовать, add_action() когда ваш плагин или тема построены с использованием классов , вам нужно использовать синтаксис, вызываемый для массива. Вы должны передать функцию add_action()в виде массива с $thisпервым элементом, а затем именем метода класса ...»

Farzad
источник