推荐替换已弃用的 call_user_method?

Posted

技术标签:

【中文标题】推荐替换已弃用的 call_user_method?【英文标题】:Recommended replacement for deprecated call_user_method? 【发布时间】:2009-04-23 17:53:35 【问题描述】:

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

一种方法是使用call_user_func(),因为通过将对象和方法名称作为第一个参数的数组提供与不推荐使用的函数相同。由于此功能未标记为弃用,我认为原因不是它们的非 OOP 风格用法?

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

我感兴趣的:

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

【问题讨论】:

【参考方案1】:

正如你所说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(&amp;$obj, "method"), "method", "args", "go", "here");

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

【讨论】:

似乎call_user_method 上的 PHP 文档中的弃用通知应该指向 call_user_func。太糟糕了,它没有,我必须搜索答案...... =D【参考方案2】:

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

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

你这样做:

$obj->$method_name($parameter);

【讨论】:

问题是当你不知道将调用哪个函数以及它是否有参数、它有多少参数等时。我正在使用 AMFPHP 通过 Flex 和PHP 和我正在构建一个网关调用程序,它将阻止我每次从 Flex 调用 PHP 多次。我需要实例化并调用多个方法,但我不知道 Flex 是否会提供参数,如果提供,它将位于给定数组中。【参考方案3】:

做这样的事情:

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

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

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

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

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

method_exists()
class_exists()

干杯

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

以上是关于推荐替换已弃用的 call_user_method?的主要内容,如果未能解决你的问题,请参考以下文章

Python 3 替换已弃用的 compiler.ast flatten 函数

什么应该替换已弃用的 Facebook adView setAdListener 以获取回调?

尝试替换已弃用的 loadnibnamed:owner

用 .on 替换已弃用的 .live [重复]

Snapkit 常量替换已弃用的 .priorityMedium() .priorityHigh() .priorityLow()?

替换 Java Awt 已弃用的方法