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

Захваты WordPress можно использовать двумя способами:

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

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

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

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

Ответы

Ответ 1

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

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

Поскольку вы не определили function_to_remove, его нельзя удалить.

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

Ответ 2

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

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();
        });
    }