2009-04-23 275 views
22

由於PHP的call_user_method()call_user_method_array()被標記爲不推薦,我想知道什麼替代方案是推薦?推薦替代已棄用的call_user_method?

一種方法是使用call_user_func(),因爲通過給一個對象和一個方法名稱作爲第一個參數的數組的做法與不推薦使用的函數相同。由於這個函數沒有被標記爲廢棄,我認爲其原因不是非OOP時尚的使用它們?

我能想到的另一種方式是使用Reflection API,這可能是最舒適和麪向未來的選擇。儘管如此,它的代碼更多,我可以想象它比使用上面提到的函數要慢。

我很感興趣:

  • 是否有通過對罵對象的方法一個完全新的技術?
  • 哪個是最快/最好/官方的替代品?
  • 棄用的原因是什麼?

回答

24

正如你所說的call_user_func可以輕鬆地複製此功能的行爲。有什麼問題?

call_user_method頁甚至列出它作爲替代:

<?php 
call_user_func(array($obj, $method_name), $parameter /* , ... */); 
call_user_func(array(&$obj, $method_name), $parameter /* , ... */); // PHP 4 
?> 

至於到爲什麼這個被廢棄,this posting explains it:

This is because the call_user_method() and call_user_method_array() functions can easily be duplicated by:

old way:
call_user_method($func, $obj, "method", "args", "go", "here");

new way:
call_user_func(array(&$obj, "method"), "method", "args", "go", "here");

就個人而言,我可能會用變量去乍得發佈的變量建議。

+0

沒問題......我只是好奇;) – okoman 2009-04-23 18:03:38

+0

好像通知在「call_user_method」的PHP文檔中的棄用應該指向'call_user_func'。太糟糕了沒有,我必須搜索SO的答案... = D – Aaron 2013-01-06 16:51:55

16

你可以使用variable variables,這看起來對我來說最清潔。相反的:

call_user_func(array($obj, $method_name), $parameter); 

你這樣做:

$obj->{$method_name}($parameter); 
+0

這個問題是,當你不知道哪個函數將被調用,如果它有或沒有參數,它有多少參數等。我正在使用AMFPHP通過Flex和PHP進行通信,並且我正在構建一個網關調用程序,它將阻止我每次從Flex調用PHP多次。我需要實例並調用多個方法,我不知道Flex是否會提供參數,如果是,它將在給定的數組中。 – 2012-06-08 16:02:51

1

做這樣的事情:

我用類似的東西在我的__construct()方法。

$params = array('a','b','c'); // PUT YOUR PARAMS IN $params DYNAMICALLY 

call_user_func_array(array($this, $this->_request), array($params)); 

第一個參數:Obect例如, 第二個參數:方法來調用, 第三個參數:PARAMS

之前,你可以測試是否方法或類也有:

method_exists() 
class_exists() 

乾杯

0

如果出現以下錯誤: 警告:call_user_func()期望參數1是有效的回調,第二個數組成員在C:\ www \ file中不是有效的方法。上線X 和這樣的代碼PHP:

call_user_func(array($this, $method)); 

使用(字符串)聲明$方法名

call_user_func(array($this, (string)$method)); 
相關問題