3

私が使用PHPしているのはcall_user_func_array、動的呼び出しを行う関数です。対応する引数を使用して関数名の配列を作成し、ループで実行します。例えば:

$methods = [
    [ 'myfunction1', [$arg1, $arg2] ],
    [ 'myfunction2', [$arg3, $arg4] ],
];

foreach ($methods as $method) {
    call_user_func_array($method[0],$method[1]);
}

これは正常に機能しますが、私が直面している問題は、$methods配列を定義する時点で、いくつかの引数がまだ定義されていないことです (たとえば$arg1$arg4持っている、$arg2持っ$arg3ていない)。呼ばれた。

したがって、その引数の値を見つける場所を関数に伝える方法を探しています。これまでのところ、私が思いついたのは、変数を変数の名前を表す文字列に置き換えることです。

$methods = [
     [ 'myfunction1', [$arg1, 'ARG2'] ],
     [ 'myfunction2', ['ARG3', $arg4] ],
];

次に foreach ループで、各引数を確認し、それが文字列であるかどうかを確認し、その文字列が変数と一致するかどうかを確認します。文字列をその変数の値に置き換えます。

foreach ($methods as $method) {
    foreach ($method[1] as $k => $arg) {
        if (is_string($arg)) {
            $name = strtolower($arg);
            if (isset(${$name})) {
                $method[1][$k] = ${$name};
            }
        }
    }
    call_user_func_array($method[0], $method[1]);
}

PHPこれは機能しますが、コードを改善するのに役立つ可能性があるため、 で使用されている他の既知のアプローチがあるかどうか疑問に思っています。

定義時にいくつかの引数が設定されていない動的呼び出しを定義できる他の方法を知っていますか?

4

3 に答える 3

1

呼び出されたときに引数の値を返す未知の引数として匿名関数を使用できます。これは作業コードです:

function myfunction($arg1, $arg2)
{
    echo "\nARGS: $arg1, $arg2";
}

$arg2func = function() {
    return 'foo';
};

$arg3func = function() {
    return 'bar';
};

$arg1 = 'baz';
$arg4 = 'chopchop';

$methods = [
    [ 'myfunction', [$arg1, $arg2func] ],
    [ 'myfunction', [$arg3func, $arg4] ],
];
foreach ($methods as $method) {
    foreach ($method[1] as $k => $arg) {
        if (is_callable($arg)) {
            $method[1][$k] = $arg();
        }
    }
    call_user_func_array($method[0], $method[1]);
}
于 2013-03-05T12:42:36.517 に答える
0

私がやったのはこれです:
-実行時に作成された変数を文字列として定義します:

$methods = [
   [ 'myfunction', [$arg1, arg4] ]
];

-実行時に作成された変数を配列に
保存します -すべての引数を調べて、一部を置き換える必要があるかどうかを確認するルーチンを追加します。

foreach ($args as $k => $arg) {
    if (is_string($arg)) {
        // pass by reference
        if ($arg[0] == '&') {
            $arg = substr($arg, 1);
            // the vars class array contains the run-time variables
            if (isset($this->vars[$arg])) {
                $args[$k] = &$this->vars[$arg];
            }
        } else {
            if (isset($this->vars[$arg])) {
                $args[$k] = $this->vars[$arg];
            }
        }
    }
}
于 2013-04-01T13:54:21.130 に答える
0

配列を介して引数を渡さない理由。呼び出されたメソッドでは、正しい引数を処理して独自のメソッドに移動できます...

于 2013-03-05T10:48:40.737 に答える