23

由于 PHPcall_user_method()call_user_method_array()标记为已弃用,我想知道推荐什么替代方案?

一种方法是使用call_user_func(),因为通过给一个带有对象和方法名称的数组作为第一个参数,它的作用与不推荐使用的函数相同。由于这个函数没有被标记为弃用,我认为原因不是它们的非 OOP 风格的用法吗?

我能想到的另一种方法是使用Reflection API,这可能是最舒适且面向未来的替代方案。尽管如此,它的代码更多,我可以想象它比使用上面提到的函数要慢。

我感兴趣的是:

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

4 回答 4

29

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

至于为什么不推荐使用此功能,此帖子对此进行了解释:

这是因为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");

就个人而言,我可能会接受乍得发布的可变变量建议。

于 2009-04-23T17:58:55.453 回答
18

您可以使用变量 variables来做到这一点,这对我来说看起来最干净。代替:

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

你做:

$obj->{$method_name}($parameter);
于 2009-04-23T17:59:10.507 回答
1

做这样的事情:

我在我的 __construct() 方法中使用了类似的东西。

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

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

第一个参数:Obect 实例,第二个参数:调用方法,第三个参数:参数

在您也可以测试方法或类之前,使用:

method_exists()
class_exists()

干杯

于 2012-12-30T15:22:37.943 回答
0

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

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

使用(字符串)声明 $method 名称

call_user_func(array($this, (string)$method));
于 2013-05-20T12:18:01.610 回答