0

我有一个在我的框架中创建子元素的公共方法,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");

当我使用接受两个以上参数(元素的类型及其名称,内部方式)的方法时,问题就来了,它是这样的

$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 回答