建议替换已弃用的call_user_method?

oko*_*man 23 php deprecated

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

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

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

我感兴趣的是:

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

Pao*_*ino 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
?>
Run Code Online (Sandbox Code Playgroud)

至于为什么这个被弃用,这篇文章解释了它:

这是因为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发布的变量建议.


Cha*_*rch 17

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

call_user_func(array($obj, $method_name), $parameter);
Run Code Online (Sandbox Code Playgroud)

你做:

$obj->{$method_name}($parameter);
Run Code Online (Sandbox Code Playgroud)