Упаковка и распаковка аргументов при создании экземпляра нового класса в PHP - PullRequest
1 голос
/ 11 декабря 2010

В Python вы можете упаковывать и распаковывать аргументы следующим образом:

def myfunction(arg1, arg2, arg3):
    pass

mydict = dict(arg1='foo', arg2='bar', arg3='baz')

myfunction(**mydict)

mylist = ['foo', 'bar', 'baz']

myfunction(*mylist)

Теперь, есть ли что-то похожее в PHP?У меня есть класс, который передается функции вместе с ассоциативным массивом, извлеченным из записи базы данных.Я хочу создать экземпляр класса, который принимает аргументы, которые называются так же, как ключи в массиве.Можно ли это сделать?

РЕДАКТИРОВАТЬ

Хорошо, поэтому я определенно не правильно сформулировал свой вопрос.Я хотел создать экземпляр нового класса динамически, когда заранее не знаю ни имени класса, ни количества аргументов.

Хотя я нашел ответ:

http://php.net/manual/en/book.reflection.php

Вот решение:

class MyClass {
    public function __construct($var1, $var2, $var3) {
        echo "$var1\n";
        echo "$var2\n";
        echo "$var3\n";
    }
}

$reflector = new ReflectionClass('MyClass');
$args = array('var1'=>'foo', 'var2'=>'baz', 'var3'=>'bar');
$instance = $reflector->newInstanceArgs($args);

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

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

Выможно взглянуть на call_user_func_array , но я не думаю, что вы можете использовать его с конструктором, так как вам нужен экземпляр объекта для вызова одного из его методов.

1 голос
/ 11 декабря 2010

Обратите внимание, что распаковка списка параметров myfunc(*args) может быть достигнута с помощью call_user_func_array () :

$args = array("foo", "bar", "baz");

call_user_func_array("myfunc", $args);

Для методов объекта вы можете использовать call_user_func_array(array($obj, "__construct"), $args). Недостатком здесь является то, что __constructor будет вызываться дважды, поэтому не следует делать никаких забавных вещей. В противном случае необходим специальный метод init.

Из-за отсутствия именованных параметров в PHP не существует эквивалента myfunc(**args). Таким образом, общая идиома - просто передать dict / array и позволить функции обрабатывать именованные параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...