长话短说我正在使用遗留的代码库,它大量使用PHP的内置call_user_func_array函数。我试图让它与PHP 5.3一起工作(从5.2升级),但遇到了这里描述的问题(在“传递非数组”部分):
http://sixohthree.com/1486/migrating-to-php-5-3-call_user_func_array
简而言之,问题是在PHP版本5.2和5.3之间,这个函数的优点已被更改,因此它基本上什么都不做,如果第二个参数不是正确的数组/对象/关联,则返回NULL
阵列。 5.2没有这样做,因此我正在使用的代码库不会确保它传递正确类型的参数。这会导致问题。
要解决这个问题,我可以按照博客文章中的说明进行搜索并搜索代码库中的每个call_user_func_array
调用并修补它们,但这将非常繁琐。或者,我注意到PHP有一个内置的override_function API调用,可以用来覆盖内置函数。这很方便,但我想做的更像是扩展内置功能。
理想情况下,我希望能够用大致类似的内容替换call_user_func_array
的实现:
function call_user_func_array($method, $params) {
$params = is_array($params) ? $params : array($params);
return old_call_user_func_array($method, $params);
}
...其中old_call_user_func_array
是内置的call_user_func_array
函数。
这是可能的,如果是的话,怎么样?
答案 0 :(得分:5)
你可以使用同样在APD扩展名中的rename_function,这样如果安装了override_function,你应该已经拥有它:
rename_function('call_user_func_array', 'old_user_func_array');
function call_user_func_array($method, $params) {
$params = is_array($params) ? $params : array($params);
old_call_user_func_array($method, $params);
}
答案 1 :(得分:1)
您的问题实际上已在在线PHP文档的第三或第四条评论中得到解答。评论部分经常提供非常有用的信息和示例(请注意,有些东西显然是不正确的!)为方便起见,我复制了相关部分:
...如果您使用rename_function将原始函数重命名为第三个名称,然后在OVERRIDING函数中调用第三个名称,您将获得所需的效果:
rename_function('strlen','new_strlen');
override_function('strlen','$ string','return override_strlen($ string);');
function override_strlen($ string){ return new_strlen($ string);}
答案 2 :(得分:0)
或者您可以将代码放在命名空间中:
namespace Phpoverride
{
function call_user_func_array($method, $params) {
return \call_user_func_array($method, $params);
}
}