Класс Walker: Проблемы с пониманием того, как метод walk() может быть вызван без ошибок


Я изо всех сил пытаюсь понять, как WordPress использует класс Walker. В частности, я не понимаю метод walk() (я думаю).

Во-первых, позвольте мне объяснить, что я понял:

При вызове wp_nav_menu(), в качестве аргумента можно добавить массив, содержащий информацию / параметры, такие как глубина, контейнер, расположение темы, используемый ходок и так далее.

Внутри wp_nav_menu() эти аргументы объединены со значениями по умолчанию. Результирующий массив (позже приведено к объекту) называется $args.

Внутри wp_nav_menu(), walk_nav_menu_tree() называется, получая $sorted_menu_items, $args->depth и $args в качестве аргументов.

До этого момента я могу понять, что происходит, но внутри walk_nav_menu_tree() создается экземпляр класса Walker, и именно здесь я больше не могу следовать.

После создания экземпляра вызывается метод walk() используемого ходока.

Согласно своей подписи, walk() принимает два аргумента: $elements и $max_depth.

Но в walk_nav_menu_tree(), walk() передается только один аргумент, называемый $args, который представляет собой массив, содержащий аргументы, переданные walk_nav_menu_tree(), которые на самом деле $items(= $sorted_menu_items), $depth (= $args->depth), $r (= $args).

Как будто это уже недостаточно запутанно, в начале метода walk() есть такая строка:

$args = array_slice(func_get_args(), 2);

Здесь происходит использование func_get_args(), все аргументы, переданные методу, собираются в массив, из которого затем первые две части опущены, что оставляет нас с $args, содержащим только содержимое третьего аргумента, который не виден в сигнатуре метода.

Теперь, как это вообще может работать – как я уже указывал, walk() вызывается только с одним аргументом, так как $elements и $max_depth могут быть опущены, не приводя к ошибке?

Author: Sven, 2014-12-20

1 answers

Согласно комментариям, он называется с call_user_func_array, таким образом, 1-е 2 элемента присваиваются объявленным аргументам $elements и $max_depth, оставляя третий элемент ($r, который является исходным $args), назначаемым через array_slice $args. Например

function wpse172812( $elements, $max_depth ) {
    $args = array_slice(func_get_args(), 2);
    error_log("elements=$elements, max_depth=$max_depth, args=" . print_r( $args, true ));
    // elements=arg1, max_depth=arg2,
    // args=Array ( [0] => Array ( [menu] => my_id [menu_class] => my_class ) )
}
$args = array( 'arg1', 'arg2', array( 'menu' => 'my_id', 'menu_class' => 'my_class' ) );
call_user_func_array( 'wpse172812', $args );
 2
Author: bonger, 2014-12-20 16:37:24