2012-01-11 35 views
2

长篇小说我正在使用一个遗留的代码库,它大量使用PHP的内置call_user_func_array函数。我试图让它使用PHP 5.3(5.2升级)的工作,但已运行到这里描述的问题(即“传递非阵列”一节):我可以扩展内置PHP函数吗?

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功能。

这是可能的,如果是这样,如何?

+2

由于代码不符合记录的API,因此它基本上已损坏,您需要在某个时刻修复该功能的每个实例,而不是在修补程序中分层。我可以看到你可能需要一个临时解决方法,所以无论如何+1。 :) – deceze 2012-01-11 04:40:05

+0

可能重复的http://stackoverflow.com/questions/4725194/php-override-existing功能 – Nazariy 2012-01-11 04:44:18

+1

@Nazariy - 该线程不处理保留旧功能。仔细阅读OP的问题。 – 2012-01-11 04:49:38

回答

5

您可以使用rename_function这也是在APD延长,所以你应该已经有了,如果你有安装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); 
} 
+0

谢谢,这工作,虽然我发现我不得不通过调用'override_function()'(传递原始函数名称作为要覆盖的函数的名称)来指定新的函数定义。 – aroth 2012-01-11 07:01:00

1

您好,您的问题实际上是在在线PHP文档中发布的第三条或第四条评论。在评论部分中通常会有非常有用的信息和示例(请注意,您也有很多事情显然不正确!)为了您的方便,我在此复制了相关部分:

...如果您使用rename_function将原始函数重命名为第三个名称,然后在OVERRIDING函数中调用第三个名称,您将获得所需的效果:

rename_function('strlen','new_strlen');

override_function('strlen','$ string','return override_strlen($ string);');

功能override_strlen($字符串){ 回报new_strlen($字符串);}

0

,或者你可以把你的代码在一个命名空间:

namespace Phpoverride 
{ 
    function call_user_func_array($method, $params) { 
     return \call_user_func_array($method, $params); 
    } 
} 

http://php.net/namespaces

+0

这并不能真正解决问题,但... – deceze 2012-01-11 05:35:52

相关问题