Как инициализировать объекты с неизвестными аргументами? - PullRequest
3 голосов
/ 17 января 2011

Я пытаюсь создать класс, методы которого вызываются с использованием магического метода PHP * __call().Этот магический метод затем будет инициализировать другой объект, подобный этому:

public function  __call($function, $arguments) {

    /* Only allow function beginning with 'add' */
    if ( ! preg_match('/^add/', $function) ) {
        trigger_error('Call to undefined method ' . __CLASS__ . '::' . $function, E_USER_ERROR);
    }

    $class = 'NamodgField_' . substr($function, 3); /* Ex: $function = addTextField() => $class = NamodgField_TextField */

    /* This doesn't work! Because $class is not an object yet */
    call_user_func_array( array(new $class, '__construct'), $arguments);
}

Последняя строка этого кода совершенно бесполезна!Я просто пытаюсь прояснить, что я хочу сделать.

Я хочу иметь возможность пропустить $arguments при инициализации нового объекта, один за другим, чтобы каждый дочерний класс мог определить егонеобходимые аргументы.

Я придумал решение, используя eval(), но оно мне действительно не нравится.

Есть идеи?

1 Ответ

3 голосов
/ 17 января 2011
$class = new ReflectionClass('a');
$object = $class->newInstanceArgs(array(1, 2, 3));

class a
{
    public function __construct($b, $c, $d)
    {
        var_dump($b, $c, $d);
    }
}
...