2012-09-02 36 views
3

我想instanciate一個類,它需要任何數量的構造參數。如何從數組中自動構建變量?

可以說我有一個類Man,它在構造函數中有兩個參數。

class Man 
{ 
    protected $name; 
    protected $age; 

    public function __construct($name, $age) 
    { 
     $this->name = $name; 
     $this->age = $age; 
    } 
} 

然後,我有PARAMS:

$params = array() 
$params['name'] = 'Jack'; 
$params['age'] = 55; 

這就是我如何實例化一個類:

$jack = new Man($params['name'], $params['age']); 

現在我想才達到的是參數數組可以是任何東西大小,2,3,4,任何和我會instanciate類將具有相同數量的參數。

所以唯一困擾我的是如何自動創建變量? 有提取物的功能,但它返回變量的數目:(

我需要這個東西。

$jack = new Man($name, $age); 

但這應該是全自動生成的腳本只知道參數數組,而且它。須推動所有數組值作爲變量

最接近的事是這樣的:

$jack = new Man(extract($params)); 

但提取函數返回編號,我需要從數組中創建變量,並將它們提供給類構造函數。

編輯:

我不能改變類林建設,我唯一的目標是構建一個類,並通過它期望在構造函數的變量。所以我沒有權力建設類的建築,我的目標是隻讓這個類實例化,並給了她的構建參數。這些參數存儲在$ params數組中,但類需要它作爲變量。希望它更容易掌握我試圖實現的目標。

感謝

+6

爲什麼不將數組傳遞給構造函數? – JvdBerg

+0

我試圖建立依賴注入容器,以便容器將實例化一個不是由我構建的類。如果這個類在構造函數中需要2個變量,那麼我必須把它們放在那裏。所以我可以「告訴」容器,在構造中有一個類需要2個參數。而這兩個參數是$ params數組。現在:)我將如何推送$ params數組中的變量作爲變量。 – Limeni

+1

已更新我的答案,以包含一個可能的函數,以允許您在不修改類的情況下提取參數。 – RMDan

回答

0

我需要的是這樣的:

ReflectionClass::newInstanceArgs

因此,解決我的問題是這樣的:

$reflection = new \ReflectionClass($class); 
return $reflection->newInstanceArgs($params); 

其中$ params爲數組使用參數,和$類的名稱Im建築類。

感謝您的所有意見!

+1

請將來,如果你回答你自己的問號,它就是你接受的答案。這樣,如果有人回來檢查,他們不會浪費時間回答/編輯他們的答案。恭喜找到解決方案。 – RMDan

+0

謝謝RMDan,我被迫等了2天才能將答案標記爲已接受。 :)感謝所有的幫助! – Limeni

1

你可以做兩件事情之一:

  1. 通行證在參數數組:

    public function __construct(array $params) {} 
    
  2. 使用func_get_args()裏面的功能讓所有的論據以關聯數組的形式。

第一種方法更可取,因爲它包含的「魔法」較少。

爲了調用具有未知參數集的函數,當參數的形式爲數組時,可以使用call_user_func_array()

-1

遍歷數組,並使用$obj->{$keyname}語法設置類的屬性。

public function __construct($params) { 
    foreach($params as $key => $value) { 
     $this->$key = $value; 
    } 
} 
1

我會通過數組構造函數:

$jack = new Man($params); 

,然後在構造函數處理PARAMS:

class Man 
{ 
    public $Age; 

    public function __construct(array $params) 
    { 
    foreach($params as $key => $value) { 
     if(property_exists($this, $key) { 
     $this->$key = $value; 
     } 
    } 
    } 
} 
1

是,提取物將返回變量的數量也也創建變量。您將不得不編寫該類,以便將數組作爲輸入,然後從類內調用抽取。這將使用設置爲數組中每個元素的標籤的名稱創建變量。

- 編輯 -

看到到的問題更改後我修改了更準確的答案。

--Example--

$params = array(); 
$params['name'] = 'Jack'; 
$params['age'] = 55; 

$jack = createMan($params); 

//Function designed to extract correct parameters from $params 

function createMan($params){ 

    extract($params); 

    if(isset($name) && isset($age)){ 
     return new man($name, $age); 
    }else{ 
     //What ever error logging and return null 
     return null; 
    } 
} 
-1

這可能幫助:

class man{ 
    public function __construct($params){ 
     foreach($params as $key=>$value){ 
     $this->$key=$value; 
     } 
    } 
} 

這樣,數組的鍵將被指定爲變量。

+0

這與我早前6分鐘的回答相同! – Eric

+0

以及我認爲打字需要幾分鐘。 – Sourabh