我可以扩展内置的PHP函数吗?

时间:2012-01-11 04:36:40

标签: php function extend

长话短说我正在使用遗留的代码库,它大量使用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函数。

这是可能的,如果是的话,怎么样?

3 个答案:

答案 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);
    }
}

http://php.net/namespaces