Анонимные функции в ловушках WordPress

Ключи WordPress можно использовать двумя способами:

  1. используя имя функции обратного вызова и соответствующую функцию

    add_action( 'action_name', 'callback_function_name' ); function callback_function_name() { // do something } 
  2. использование анонимной функции (закрытие)

     add_action( 'action_name', function() { // do something } ); 

Есть ли разница в WordPress, какой способ использовать? Что предпочтительнее и почему?

Недостатком анонимной функции является то, что вы не можете удалить действие с помощью remove_action .

Важно: Чтобы удалить крючок, аргументы $function_to_remove и $priority должны совпадать, когда был добавлен крюк. Это касается как фильтров, так и действий. Предупреждение об отказе не будет выдано.

Потому что вы не определили function_to_remove , вы не можете ее удалить.

Поэтому вы никогда не должны использовать это внутри плагинов или тем, которые кто-то еще захочет переписать.

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

 add_action('admin_init', function () { // some code... }); 

Лично я предпочел бы использовать закрытие в качестве обратных вызовов, если :

  • Вы хотите, чтобы удалить обратный вызов
  • Функция обратного вызова должна использоваться более одного раза
  • Вам нужна поддержка старых версий PHP (менее 5,3)

Закрытие в классах

Закрытие также может быть полезным в классах .

 class SomeClass { public function __construct() { add_action('wp_head', function () { $this->addSomeStyling(); }); } protected function addSomeStyling() { echo '<style> body { color: #999; } </style>'; } } 

Обычно методы обратного вызова должны быть обнародованы , но в этом случае вы также можете сделать их частными или защищенными .

Это решение работает только для PHP 5.4+. Чтобы заставить его работать для PHP 5.3, вам необходимо явно передать ссылку на $this ссылку на объект, например:

  public function __construct() { $self = $this; add_action('wp_head', function () use ($self) { $self->addSomeStyling(); }); }