Функции и методы с переменным количеством аргументов в WordPress 5.3

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

На этот пост меня вдохновил комментарий Игоря, дело в том, что после обновления WordPress на 5.3, начали появляться PHP warnings, например у тех, кто модифицировал классы при помощи волкеров.

Как исправить PHP предупреждения.

Прежде всего вам нужно иметь ввиду, что если у вас не отображаются PHP предупреждения, то это не значит, что их нет 😁, вы ведь понимаете, что я говорю про эту строчку в файле wp-config.php вашего сайта?

define( 'WP_DEBUG', false ); // false – предупреждения отключены, true - включены

То есть если вдруг у вас не получится разобраться в том, что я буду описывать дальше в этом уроке, вы можете всего лишь поменять значения true на false и на какое-то время забить на это.

А теперь предположим, что вы когда-то модифицировали волкер меню при помощи моего кода:

class True_Walker_Nav_Menu extends Walker_Nav_Menu {
 
	function start_lvl(&$output, $depth) {
		// тут какие-то ваши модификации
	}
 
	...
 
}

И вдруг, внезапно после обновления на WordPress 5.3 вы стали получать следующее уведомление:

Что делать в этой ситуации? Ммм.. Есть идеи? Последовать рекомендациям конечно и поменять строчку на какую написано! 😁

function start_lvl(&$output, $depth = 0, $args = NULL) {

Что такое функции с переменным количеством аргументов?

Постараюсь очень кратко, чтобы вам было понятно, о чем дальше речь. Если нужно больше информации, можете погуглить про spread operator в какой-нибудь документации PHP.

К примеру давайте взглянем на эту функцию:

function true_umnozhenie( ...$numbers ) {
 
    $result = 1;
 
    foreach ( $numbers as $number ) {
        $total = $total * $number;
    }
 
    return $result;
}

Эта функция может получать любое количество аргументов, перемножать их и возврать результат, например: echo true_umnozhenie( 15, 20, 75 );. Как видите, благодаря оператору ..., функция поработала с $numbers как с массивом, хотя мы просто передали в неё числа через запятую.

Что такое распаковка аргументов?

Второй пример!

Допустим, у нас есть уже определённая функция, которая перемножает только три числа:

function true_umnozhenie_3( $a, $b, $c ) {
	return $a * $b * $c;
}

Раньше, до PHP 5.6, для того, чтобы передать в неё массив из трёх чисел, нам нужно было передавать все элементы по отдельности:

$numbers = array( 5, 10, 75 );
echo true_umnozhenie_3( $numbers[0], $numbers[1], $numbers[2] );

Теперь это делается оператором ...

$numbers = array( 5, 10, 75 );
echo true_umnozhenie_3( ...$numbers );

Надеюсь, что это пролило немного света на функции с переменным количеством аргументов и на распаковку аргументов.

Реальный пример в коде ядра WordPress

Возможно на первый взгляд оператор ... может показаться из серии – ну окей, вроде бы как стало поприятнее, но не то что бы очень 🤔 Но для того, чтобы понять всю глобальность ситуации, давайте рассмотрим изменения во всем нам известной функции current_user_can().

Так функция выглядела в версии WordPress 5.2 и ниже:

function current_user_can( $capability ) {
    $current_user = wp_get_current_user();
 
    if ( empty( $current_user ) ) {
        return false;
    }
 
    $args = array_slice( func_get_args(), 1 );
    $args = array_merge( array( $capability ), $args );
 
    return call_user_func_array( array( $current_user, 'has_cap' ), $args );
}

А так она выглядит в версии WordPress 5.3:

function current_user_can( $capability, ...$args ) {
    $current_user = wp_get_current_user();
 
    if ( empty( $current_user ) ) {
        return false;
    }
 
    return $current_user->has_cap( $capability, ...$args );
}

Итак, вывод.

Другая, всеми нами знакомая функция, которая получила оператор переменного количества аргументов – add_query_arg()!

Список затронутых классов и их методов

Стоп, а где же start_lvl(), про который мы говорили в самом начале этого урока? Нет, я не хочу вас надурить, в этом списке лишь те методы, которые приобрели оператор переменного количества аргументов ....

По теме:

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии