web-dev-qa-db-ja.com

Walkerクラス:walk()メソッドをエラーなしで呼び出す方法を理解する上での問題

WordPressがWalkerクラスをどのように使用しているのか理解していません。特に、私はwalk()メソッドを理解していません(私は思います)。

まず、私が理解したことを説明しましょう。

wp_nav_menu() を呼び出すときには、depth、container、theme location、walkerなどの情報/オプションを含む配列を引数として追加することができます。

wp_nav_menu()内では、これらの引数はデフォルト値とマージされています。結果の配列(後でオブジェクトにキャスト)は$argsと呼ばれます。

wp_nav_menu()内で、 walk_nav_menu_tree() が呼び出され、引数として$sorted_menu_items$args->depthおよび$argsを受け取ります。

その時点まで私は何が起こっているのか理解することができますが、walk_nav_menu_tree()の中では Walkerクラス がインスタンス化されています、そしてこれは私がもう追いかけられないところです。

インスタンス化後、使用されたWalkerのwalk()メソッドが呼び出されます。

そのシグネチャによれば、walk()は2つの引数、$elementsおよび$max_depthを受け入れます。

しかしwalk_nav_menu_tree()では、walk()$argsと呼ばれる1つの引数のみを渡されます。これはwalk_nav_menu_tree()に渡される引数を含む配列で、実際は$items(= $sorted_menu_items)です。 、$depth(= $args->depth)、$r(= $args).

walk()メソッドの最初に、これで十分に混乱しないように、次の行があります。

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

ここで起こることはfunc_get_args()を使うことです、メソッドに渡されるすべての引数は配列に集められます、そしてそれから最初の2つの部分は省略されます、それで私たちはメソッドで見えない3番目の引数の内容を含む$argsを残します署名。

さて、walk()は1つの引数だけで呼び出されるので、エラーにならずに$elements$max_depthを省略することができるのですか。

3
Sven

コメントごとに、 call_user_func_array で呼び出されるため、最初の2つの要素は宣言された引数$elements$max_depthに割り当てられ、3番目の要素($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
bonger