АНОНИМНЫЕ PHP ФУНКЦИИ В ХУКАХ WORDPRESS

АНОНИМНЫЕ PHP ФУНКЦИИ В ХУКАХ WORDPRESS

Анонимные PHP функции, также известные как замыкания или lambda-функции, позволяют создавать функции без конкретных имен. В WordPress они особенно удобны как значения обратных вызовов (callback) в хуках (filters и actions). Эти функции появились в PHP начиная с версии 5.3 и немного улучшились в версии 5.4.

Несмотря на то, что анонимные функции существуют уже давно, в коде плагинов WordPress их практически не встретишь. Например, в JavaScript они используются повсеместно. Почему так?

Давайте сначала рассмотрим, как выглядит хук с обычной функцией и с анонимной функцией.

Пример использования хуков

// 1. Хук с обычной функцией
add_filter( 'the_content', 'filter_the_content');
function filter_the_content( $content ) {
    // Изменяем содержимое
    return $content;
}

// 2. Хук с анонимной функцией
add_filter( 'the_content', function( $content ) {
    // Изменяем содержимое
    return $content;
});

У первого метода есть одно главное преимущество: поскольку функция имеет имя, хук можно легко удалить, если это необходимо, с помощью функций remove_filter() или remove_action(). Поэтому анонимные функции не часто используются в плагинах и темах. Однако если хук создается с использованием замыкания, его нельзя надежно удалить.

Преимущества анонимных функций в WordPress

  • Краткий синтаксис: проще писать.
  • Чистота глобального пространства имен: нет необходимости беспокоиться о конфликтах имен функций.
  • Не нужно придумывать имена для функций обратных вызовов: иногда это занимает много времени.

Недостатки анонимных функций в WordPress

  • Невозможно удалить хук, созданный на основании анонимной функции.
  • Невозможно использовать одну и ту же функцию в нескольких хуках — для каждого нужно писать отдельную анонимную функцию. Например:
add_filter( 'the_content', 'filter_the_content' );
add_filter( 'widget_text', 'filter_the_content' );

function filter_the_content( $content ) {
    // Изменяем содержимое
    return $content;
}

// или
add_filter('the_content', function( $content ) {
    // Делаем что-то
    return $content;
});

add_filter('widget_text', function( $content ) {
    // Делаем что-то
    return $content;
});

Тем не менее, этот недостаток не так однозначен, поскольку в PHP (начиная с версии 5.3) и JavaScript анонимную функцию можно сохранить в переменной и затем использовать как функцию обратного вызова для хука:

$my_callback = function( $content ) {
    // Делаем что-то
    return $content;
};

add_filter( 'the_content', $my_callback );
add_filter( 'widget_text', $my_callback );

Однако этот подход используется довольно редко. Можно применять его, например, в отдельном шаблоне темы, когда код уже завершает свою работу, и такие хуки не будут мешать другим частям кода. Либо когда они срабатывают только при редких условиях — в отдельной ветке логики кода. В целом, я не припомню, когда это было необходимо...

ИСПОЛЬЗОВАНИЕ "USE" В АНОНИМНЫХ ФУНКЦИЯХ

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

$var = 'Привет, мир!';
$func = function() use ( $var ) { echo $var; };
$func(); //> Привет, мир!

Переменные передаются по значению, но можно также передать ссылку на переменную, указав &:

$var = 'Привет, мир!';
$func = function() use ( & $var ) { $var = $var . ' Мы в гости!'; };
$func(); // вызов
echo $var; //> Привет, мир! Мы в гости!

КОГДА ИСПОЛЬЗОВАТЬ АНОНИМНЫЕ ФУНКЦИИ В WORDPRESS?

  • Если код не предназначен для широкого использования.
  • Если необходимость в удалении функции обратного вызова отсутствует.
  • Если нет нужды поддерживать версии PHP ниже 5.3.

Теперь, когда мы разобрались в вопросе, можно ответить на вопрос: "Почему анонимные функции не используются в WordPress?" — Потому что код WordPress должен быть как можно более гибким, а замыкания не способствуют этому.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *