2

メソッドを動的にロードする __call() メソッドを作成しました。私が回避したい問題の 1 つは、__call() が呼び出しから渡されたすべてのパラメーターの配列を作成するという事実です。これは私のコードです

public function __call($method, $params)
{
    if (count($params) <= 1)
            $params = $params[0];

    foreach (get_object_vars($this) as $property => $value) {

        $class = '\\System\\' . ucfirst(str_replace('_', '', $property)) . '_Helper';

        if (strpos($method, str_replace('_', '', $property)) !== false) {

            if (!in_array($class, get_declared_classes()))
                $this->$property = new $class($params);

            $error = $method . ' doesn\'t exist in class ' . $class;

            return (method_exists($class, $method) ? $this->$property->$method($params) : $error);
        }
    }
}

問題は、1 つのパラメーターしか持たない配列を説明できることですが、一部のメソッドは __call() メソッドの動的な性質を制限する複数のパラメーターを取り込んでいます。

配列を動的に渡されるメソッド パラメータに変換するにはどうすればよいですか?

それで

array(0 => 'stuff1', 1 => 'stuff2');

として渡すことができます

$this->->helper->test($param1, $param2);

それ以外の

$this->helper->test($params);

現在の設計では、次のようなパラメーターにアクセスする必要があります

public function test($params)
{
    print_r($params);
    echo $param[0];
}

しかし、私はそれを伝統的な方法で使用したい

public function test($param1, $param2)
{
    echo $para1 . " " . $param2;
}

一部のメソッドは 2 つ以上のパラメーターを取ることに注意してください。その理由は、私が作成したものではない従来のスタイルのクラス メソッドを含める場合、すべてのパラメーター呼び出しを配列インデックス ポインターに変換する必要があるからです。

編集:

答えの通り

return (method_exists($class, $method) ? call_user_func_array(array($this->$property, $method), $params) : $error);

これは機能しますか?

4

3 に答える 3

5

call_user_func_arrayで実行できます

call_user_func_array( array($this->$property, $method), $params );

または反射を介して

于 2012-04-21T07:45:58.010 に答える
0

が必要なようですcall_user_func_array()このコメントも参考になります。

(また、エラー文字列を返すだけでなく、例外をスローすることも検討してください。)

于 2012-04-21T07:45:55.460 に答える
0

PHP 5.6 以降、次のように新しいsplat 演算子を使用して引数をアンパックできます。

public function __call($method, $params) {
    $result = $this->helper->$method(...$params);
    return $result;
}
于 2021-06-03T22:34:17.490 に答える