2010-12-11 4 views
1

В Python, вы можете упаковать и распаковать аргументы так:Довод упаковки и распаковки при создании экземпляра нового экземпляра класса в PHP

def myfunction(arg1, arg2, arg3): 
    pass 

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

myfunction(**mydict) 

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

myfunction(*mylist) 

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

EDIT

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

Я нашел ответ, хотя:

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

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

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

+0

Это то, что я делал в прошлом. Просто передайте массив функции (до тех пор, пока функция разрешена) – Matthew

1

Обратите внимание, что список пар распаковки 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.

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

+0

В комментариях call_user_func_array() есть несколько очень хороших альтернатив для выполнения функций, а не только для класса, например комментарий Damin. – gaborous

Смежные вопросы