Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以扩展内置的PHP函数吗?_Php_Function_Extend - Fatal编程技术网

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

我可以扩展内置的PHP函数吗?,php,function,extend,Php,Function,Extend,长话短说,我正在使用大量使用PHP内置函数的遗留代码库。我试图让它与PHP5.3(从5.2升级)一起工作,但遇到了这里描述的问题(在“传递非数组”部分): 简而言之,问题是在PHP版本5.2和5.3之间,此函数的bevavior发生了更改,因此如果第二个参数不是正确的数组/对象/关联数组,它基本上不执行任何操作,并返回NULL。5.2没有这样做,因此我正在使用的代码库没有努力确保它传递正确类型的参数。这会引起问题 为了解决这个问题,我可以按照博文中的说明查找代码库中的每个call\u user

长话短说,我正在使用大量使用PHP内置函数的遗留代码库。我试图让它与PHP5.3(从5.2升级)一起工作,但遇到了这里描述的问题(在“传递非数组”部分):

简而言之,问题是在PHP版本5.2和5.3之间,此函数的bevavior发生了更改,因此如果第二个参数不是正确的数组/对象/关联数组,它基本上不执行任何操作,并返回
NULL
。5.2没有这样做,因此我正在使用的代码库没有努力确保它传递正确类型的参数。这会引起问题

为了解决这个问题,我可以按照博文中的说明查找代码库中的每个
call\u user\u func\u array
调用并修补它们,但这将非常繁琐。另外,我注意到PHP有一个内置API调用,可以用来覆盖内置函数。这很方便,但我想做的更像是扩展内置函数

理想情况下,我希望能够将
call\u user\u func\u 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
函数


这有可能吗?如果有,怎么可能?

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

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

重命名_函数('strlen','new_strlen')

重写函数('strlen','$string','return override_strlen($string);')

函数覆盖\u strlen($string){ return new_strlen($string);}

您可以使用它,它也在APD扩展中,因此如果您安装了override_函数,您应该已经有了它:

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

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

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

由于代码不符合文档中的API,因此它基本上已被破坏,因此您需要在某个时间点修复该函数的每个实例,而不是一个补丁一个补丁地分层。我可以看出,您可能需要一个临时解决方案,所以无论如何+1.:)可能是@Nazary的重复-该线程不处理保留旧函数的问题。仔细阅读OP的问题。deceze说了什么。您的代码已损坏,解决方案是修复您的代码,而不是尝试更改PHP的行为,以便它接受您的损坏代码并对其执行意外操作。这是通往无法维持的噩梦般废墟的道路。唯一的解决办法是找到并修复每个实例,不管您认为它有多么乏味
call\u user\u func\u array
非常容易获得。为什么不反过来呢?将覆盖函数添加为
your\u call\u user\u func\u array
并搜索和替换对内置函数的所有其他引用(作为临时措施)。谢谢,这很有效,尽管我发现我必须使用调用
override\u function()来指定新函数定义。
(传递原始函数名作为要重写的函数名)。