繁体   English   中英

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

[英]Can I Extend a Built-In PHP Function?

总而言之,我正在使用一个遗留代码库,该遗留代码库大量使用了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有一个内置的overlay_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函数。

这可能吗?如果可以,怎么办?

您可以使用APD扩展名中的named_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);
}

您好,您的问题实际上在在线PHP文档中的第三或第四条评论中得到了回答。 在注释部分中通常有非常有用的信息和示例(请注意,还有一些有时是明显不正确的somtimes内容!)为了方便起见,我在此处复制了相关部分:

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

named_function('strlen','new_strlen');

override_function('strlen','$ string','returnoverride_strlen($ string);');

函数override_strlen($ string){返回new_strlen($ string);}

或者您可以将代码放在命名空间中:

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

http://php.net/namespaces

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM