是否可以替换(monkeypatch)PHP函数?

时间:2009-02-10 00:24:19

标签: php function monkeypatching

您可以在Python中执行此操作,但是可以在PHP中使用吗?

>>> def a(): print 1
... 
>>> def a(): print 2
... 
>>> a()
2

e.g:

<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1

6 个答案:

答案 0 :(得分:13)

这是一个,但我只想指出,自PHP 5.3以来,实际上可以在不使用PHP扩展的情况下覆盖内部函数。

诀窍是您可以在命名空间内重新定义内部PHP函数。它基于PHP为函数命名解析的方式:

在命名空间内(比如A \ B),在运行时解析对非限定函数的调用。以下是对函数foo()的调用的解析方法:

  1. 它从当前命名空间中查找函数:A \ B \ foo()。
  2. 它试图找到并调用全局函数foo()

答案 1 :(得分:9)

不,不可能像你期望的那样这样做。

来自manual

  

PHP不支持函数重载,也不可能取消定义或重新定义以前声明的函数。

但是,您可以使用runkit_function_redefine及其表兄弟,但它绝对不是很优雅......

您也可以使用create_function执行以下操作:

<?php
$func = create_function('$a,$b','return $a + $b;');
echo $func(3,5); // 8
$func = create_function('$a,$b','return $a * $b;');
echo $func(3,5); // 15
?>

与runkit一样,它不是很优雅,但它提供了您正在寻找的行为。

答案 2 :(得分:5)

我意识到这个问题有点旧,但Patchwork是最近发布的PHP 5.3项目,它支持重新定义用户定义的函数。但是,正如作者所提到的,您需要求助于runkitphp-test-helpers来修补核心/库函数。

答案 3 :(得分:2)

答案 4 :(得分:1)

正如jmikola所说,如果你想为一个函数添加代码,Patchwork是一个很好的解决方案。

这是一篇关于它是如何工作的文章: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

附带一些示例代码。我认为phpmyweb版本使用稍微好一点的代码,因为他不使用eval()代码,不像拼凑而成。您可以在使用eval()时缓存操作码。

答案 5 :(得分:0)

接受的答案非常好!!!我只想补充一点,您可以将代码放在Namespace brackets中,然后重置默认的GLOBAL-SPACE。

其他一些方式:

1)rename_function($old_name,$new_name)

2)override_function($old_name, $parameters, $new_func)

并且很少使用:

3)runkit_function_rename(...)

4)runkit_function_redefine(...)