建议替换已弃用的call_user_method?

时间:2009-04-23 17:53:35

标签: php deprecated

由于PHP的call_user_method()call_user_method_array()被标记为已弃用,我想知道推荐哪种替代方案?

一种方法是使用call_user_func(),因为通过给出一个带有对象和方法名称的数组作为第一个参数,就像弃用的函数一样。由于此功能未标记为已弃用,我认为原因不是非OOP时尚的使用吗?

我能想到的另一种方式是使用Reflection API,这可能是最舒适和面向未来的选择。然而,这是更多的代码,我可以想象它比使用上面提到的函数慢。

我感兴趣的是:

  • 是否有一种全新的技术可以按名称调用对象的方法?
  • 哪个是最快/最好/官方的替代品?
  • 弃用的原因是什么?

4 个答案:

答案 0 :(得分:26)

正如您所说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:

  

这是   因为call_user_method()call_user_method_array()功能   很容易被复制:

     旧的方式:
  call_user_method($func, $obj, "method", "args", "go", "here");

     

新方式:
  call_user_func(array(&$obj, "method"), "method", "args", "go", "here");

就个人而言,我可能会选择Chad发布的变量建议。

答案 1 :(得分:17)

你可以使用variable variables来做,这看起来对我来说最干净。而不是:

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

你这样做:

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

答案 2 :(得分: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()

干杯

答案 3 :(得分:0)

如果您收到以下错误: 警告:call_user_func()期望参数1是有效的回调,第二个数组成员不是第X行的C:\ www \ file.php中的有效方法 和这样的代码:

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

$ method name

的use(string)声明
call_user_func(array($this, (string)$method));