Класс 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
могут быть опущены, не приводя к ошибке?
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 );