2010-09-07 32 views
3

我在一些mvc代碼中使用了__call魔術來生成自動裝載表單框架,但是我遇到了一個問題,我希望這裏的某個人可能有一個解決方法。__call magic在PHP中創建新類

__call魔法需要兩個參數:$ methodName和$ arguments。參數以您調用的一系列參數的形式返回。通常這個函數被調用的方法,你可以做這樣使這些參數送入一個功能:

call_user_func_array($methodName, $arguments); 

,這將傳播完成與參數的方法簽名。我正在嘗試做一些更復雜的事情。我試圖以同樣的方式傳播類構造函數,通過能夠發送可能的內部逗號deliminenated參數到類的構造函數或僅直接發送參數,但這兩個都不會產生所需的結果。當我將內爆數組發送到構造函數中時,PHP認爲它是一個字符串,當我發送數組時,它認爲它是一個數組。

這是代碼我使用ATM:

public function __call($method, $args){ 

    return $this->init_element(new $method($args['name'], $args['value'], $args['opts'])); 

} 

如果我有4個參數,雖然傳遞下去?有沒有辦法讓我可以動態地填充構造函數,就像使用call_user_func_array()函數一樣?

我可以使用一個屬性()函數來做到這一點,但我真的很想能夠像我可以用函數來做到這一點。

由於提前,

+1

的可能重複的[傳遞從數組參數中PHP來構造](http://stackoverflow.com/questions/3395914/pass-arguments-from-array-in- PHP的構造函數) - 使用反射。 – Gordon 2010-09-07 11:34:19

+0

是的,這可能工作,我會試試看,看看它是否工作謝謝:) – Sammaye 2010-09-07 11:35:58

回答

0

使用PHP的反射類:(http://php.net/manual/en/class.reflectionclass.php

$obj = new ReflectionClass($classname);

然後

$ins = $obj->newInstanceArgs($arguments);

$ins = $obj->newInstance();

+1

此解決方案已在鏈接副本中提供。 – Gordon 2010-09-07 11:49:17

+0

woops,我沒注意到 – Kolky 2010-09-07 11:51:16

+0

這個函數的速度是多少?我知道反射會很慢嗎? – Sammaye 2010-09-07 11:59:17

-1

我看到下面的某處網絡上:

call_user_func_array(array($obj, '__construct'), $args); 
+0

有人可以解釋爲什麼這已被標記,因爲據我所知這不僅是相同的速度(如果不是一點點更快)而不是反射,並且似乎沒有任何真正的安全副作用。有人可以告訴我爲什麼這被標記了嗎? – Sammaye 2010-09-07 12:57:00

+0

@Sammaye是不是我誰downvoted,但我會說它被dv'ed,因爲它不起作用。在現有實例上調用'__construct'是毫無意義的,提供類名而不是'$ obj'將產生警告,並且不會產生實例。如果你想'call_user_func_array'給類一個靜態工廠方法並且調用它。 – Gordon 2010-09-07 13:58:33

+0

啊,這可能是好的,我需要在兩者之間進行基準測試。 – Sammaye 2010-09-07 14:21:57