24.04.2024

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

Анонимные PHP функции, также известные как замыкания (closures) или лямбда-функции, позволяют создавать функции не имеющие определенных имен.

В WP они наиболее удобны в качестве значений callback-функций в хуках (фильтрах и событиях). Появились в 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(). Это тем, кто будет пользоваться вашим кодом. Поэтому в плагинах и темах анонимные функции редкие гости... А вот если хук создан с помощью замыкания, то удалить его уже никак нельзя.

Преимущества анонимных функций в WP
  • Короткий синтаксис (удобнее писать).
  • Более чистое глобальное пространство имен и не нужно переживать за конфликты имен функций.
  • Не нужно придумывать названия для callback функций (иногда это отнимает немало времени).
Недостатки анонимных функций в WP
  • Невозможно удалить хук, созданный на базе анонимной функций.
  • Невозможно использовать одну и туже функцию в нескольких хуках — для каждого нужно писать отдельную анонимную функцию. Пример:
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) как и в JS анонимную функцию можно поместить в переменную и затем использовать переменную в качестве коллбек-функции хука:

$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?
  • Если код не предназначен для широкого использования.
  • Возможность удаления callback функции не нужна и не будет нужна.
  • Не нужна поддержка PHP версий ниже 5.3.

Теперь, немного разобравшись что к чему, можно ответить на вопрос, — «Почему в WP не используются анонимные функции?» — Потому что код WP должен быть максимально гибким, а замыкания как раз не про это…

Добавить комментарий

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