Как я могу создать экземпляр класса, используя функцию стиля «обработка функций»? - PullRequest
2 голосов
/ 30 января 2011

Я пытаюсь реализовать очередь в стиле Command Pattern, и я не знаю, как передать аргументы в конструктор объекта.

Мой шаблон 'Command' хранит объекты в базе данных, где у меня естьтаблица queue_items, в которой хранятся мои объекты 'Command', с полями class, method, constructor_arguments (хранятся в виде индексированного массива), method_arguments (хранятся в виде индексированного массива) и object_type (*1000*).

Если object_type - это «экземпляр», я создаю экземпляр объекта с помощью ключевого слова «new».Если object_type является «статическим», то я просто выполняю вызов, используя forward_static_call_array().

Если у меня нет аргументов конструктора, я могу просто использовать что-то вроде этого:

$instance = new $class_name(); //NOTE: no arguments in the constructor
$result = call_user_func_array(array($instance, $method_name), $method_arguments);

Но , если я хочу передать значения из constructor_arguments в __construct(), я не могу найти функцию, позволяющую мне это сделать.

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

Кто-нибудьзнаете, как передать индексированный массив непосредственно в __construct в стиле call_user_func_array()?Или это просто невозможно?

Дрю Дж. Сонн.

Ответы [ 2 ]

2 голосов
/ 30 января 2011

Вы можете использовать ReflectionClass для этого особого случая:

$rc = new ReflectionClass($className);
$instance = $rc->newInstanceArgs($array_of_parameters);
1 голос
/ 30 января 2011

Более сложный пример с использованием ReflectionClass:

<?php
class MyClass
{
    private $arg1;
    private $arg2;

    public function __construct($arg1, $arg2 = "Hello World")
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }

    public function print(){
        echo $this->arg2 . "," .$this->arg2;
    }
}

$class = new ReflectionClass('MyClass');
$args = array(3,"outro");
$instance = $class->newInstanceArgs($args);
$instance->print()

?>
...