На этот пост меня вдохновил комментарий Игоря, дело в том, что после обновления 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()
, про который мы говорили в самом начале этого урока? Нет, я не хочу вас надурить, в этом списке лишь те методы, которые приобрели оператор переменного количества аргументов ...
.