是否可以替换php中的函数(如mail)并使其执行其他操作?

是否可以替换php中的函数(如mail)并使其执行其他操作?,php,function,Php,Function,我想在PHP中重写一个函数(比方说mail()函数),并希望从现在开始调用mail()时,它将加载我的mail()版本,而不是默认的PHP版本。这在php中可能吗 我之所以要这样做,是因为我有数千行调用mail()的代码,我不想全部重写 另外,作为将来的参考,在计算机编程中,当您执行类似操作时,它被称为什么?它被称为函数重载,在原生PHP中不可能,但可以使用其他答案中概述的扩展。PHP文档声称这根本不可能:这是不正确的。您所指的通常称为 虽然PHP通常不支持,但实际上,可以使用或重新定义内部函数

我想在PHP中重写一个函数(比方说mail()函数),并希望从现在开始调用mail()时,它将加载我的mail()版本,而不是默认的PHP版本。这在php中可能吗

我之所以要这样做,是因为我有数千行调用mail()的代码,我不想全部重写


另外,作为将来的参考,在计算机编程中,当您执行类似操作时,它被称为什么?

它被称为函数重载,在原生PHP中不可能,但可以使用其他答案中概述的扩展。PHP文档声称这根本不可能:这是不正确的。

您所指的通常称为

虽然PHP通常不支持,但实际上,可以使用或重新定义内部函数(以及用户函数)。当然,要使用它,您需要对PHP安装有完全的控制权——因为它没有与PHP捆绑在一起,您需要这样做


同样,在正常情况下,内部函数以及用户函数
不能在PHP中重新定义(或重载)。这种情况说明了使用用户函数包装某些内部函数的好处。

您可以使用regexps替换文件中的函数名。你用什么应用取决于你自己,但我推荐价格昂贵的(除非你不再需要)

替换

   (\s+)mail([\s(]+)


对不起,我的正则表达式fu,我不知道如何在一个表达式中搜索空格或行首。

有一个扩展,允许您重写函数。它是用来调试的,但我想你可以根据自己的需要使用它。看一看:

如果希望在版本中调用原始函数,请确保阅读以下注释:

仅供参考,Python在这方面非常出色。PHP不是。@gahooa他在试图避免重构代码,我怀疑他是否会用Python重写所有代码,以使重构更容易。在重复标记的主题中可能会重复优秀答案。这似乎比runkit更简单。你的链接已失效:-(@ewan在页面中间,“PHP不支持函数重载,也不可能取消定义或重新定义以前声明的函数。“蒂姆。是的,这是需要编辑的部分。请看米兰的答案和你自己的答案。编辑答案以反映这一点。学到的经验教训。你知道php没有过载的原因吗?它似乎是一个有用的工具。+1表示runkit超过APD。APD似乎更笨重(如果您想从重载中调用旧函数,或者如果您想monkeypatch多个函数,您必须进行几次破解)-而且似乎APD会弄乱php进程的退出代码,这意味着在您可能希望使用它的情况下,它会导致构建失败(覆盖诸如mt_rand()和time()之类的内容)在一个运行uder的phpunit测试用例中,比如说,来自Jenkins的Ant)。是对更新的PHP版本的更新。@Tim,它不是重载。它是重写。我认为这将得到它们中的大多数
(^ |\t |\s | \{)mail\s*(.*)
如果紧挨代码块,则在行首、制表符、空格或开口大括号处匹配。替换时,您需要在新函数名前面添加空格。如果代码块不是以开口大括号开头,也可以{您需要在正则表达式匹配中替换它。@nickfox:我写的那些是我在一个非常混乱的生产源中使用的,所以它是经过现场测试的,不是基于假设的。@Ravelen,这似乎是在回避问题,而不是回答问题。这是一个可行的解决办法,可以解决提问者的问题。
   $1new_function_name$2
   ^mail([\s(]+)
   new_function_name$1