Анонимные функции в ловушках 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();
});
}