2010-12-11 27 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中類似的東西?我有一個傳遞給函數的類,以及從數據庫記錄中提取的關聯數組。我想創建一個類的實例,它接受與數組中的鍵相同的參數。可以做到嗎?

編輯

好了,我肯定沒有正確地制定我的問題。我想動態地實例化一個新的類,當我事先不知道類名和參數的數目時。

我已經找到了答案,但:

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 2010-12-11 14:42:50

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方法。

由於缺少命名參數,因此在PHP中不存在等效於myfunc(**args)的值。因此,一個常見的習慣用法是將dict /數組傳入,並讓函數處理名爲params。

+0

在call_user_func_array()的註釋中,有一些非常好的替代方案可用於在函數上執行此操作,而不僅僅用於類,如Damin的註釋。 – gaborous 2015-04-21 14:26:02