0

フレームワークにサブ要素を作成するための public メソッドがあり、addElement()次のように定義されています。

// addElement - adds an element (experimental version)
public function addElement() {
    if ($arguments = func_get_args()) {
        $class = "\\UI\\{$arguments[0]}";

        if (func_num_args() > 1) {
            $parameters = null;

            foreach (array_slice($arguments, 1) as $argument) {
                $parameters[] = (is_numeric($argument) ? $argument : "\"{$argument}\"");
            }

            $this->elements[($arguments[0] === HTML ? uniqid() : $arguments[1])] = new $class(implode(", ", $parameters));
        }
    }
}

そして、次のように呼び出されます。

$article1 = new \UI\Article("article1");
$article->addElement(\UI\Aside, "aside1");

または、代わりに (新しい要素に直接アクセスする必要があるかどうかによって異なります):

$article1 = new \UI\Article("article1");
$aside1 = $article->addElement(\UI\Aside, "aside1");

問題は、2 つ以上の引数 (要素の型とその名前、内部的に) を受け入れるメソッドを使用するときに発生します。これは次のとおりです。

$article1 = new \UI\Article("article1");
$article1->addElement(\UI\Abbreviation, "abbr1", "RAM", "Random Access Memory");

このメソッドを使用すると、関数に渡される引数は文字通り次のようになります。

"abbr1", "RAM", "Random Access Memory"

私の意図は、通常、特定の関数に引数を渡すかのように、この文字列を渡すことでした。どうすればそれを実行できますか(関数を再構築する必要がある場合は問題ありませんが、理想的には欠落しているビットを追加したいだけですが、このように進めることが正しい場合)?

4

1 に答える 1

2

クラスのインスタンスを取得するときにリフレクションを使用し、次のように引数の配列を渡すことができます。

$ref = new ReflectionClass( $class);
$this->elements[($arguments[0] === HTML ? uniqid() : $arguments[1])] = $ref->newInstanceArgs( $parameters);

これも必要ありません:

$parameters = null;

foreach (array_slice($arguments, 1) as $argument) {
     $parameters[] = (is_numeric($argument) ? $argument : "\"{$argument}\"");
}

ifそのステートメントの内容を、この後に配置された上記のコードに置き換えることができます。

$parameters = array_slice( $arguments, 1);
于 2013-01-13T19:02:35.323 に答える