您可以在 Python 中执行此操作,但在 PHP 中可以吗?
>>> def a(): print 1
...
>>> def a(): print 2
...
>>> a()
2
例如:
<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
您可以在 Python 中执行此操作,但在 PHP 中可以吗?
>>> def a(): print 1
...
>>> def a(): print 2
...
>>> a()
2
例如:
<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
这有点晚了,但我只想指出,从 PHP 5.3 开始,实际上可以在不使用 PHP 扩展的情况下覆盖内部函数。
诀窍是您可以在命名空间内重新定义内部 PHP 函数。它基于 PHP 对函数进行名称解析的方式:
在命名空间内(比如 A\B),对不合格函数的调用在运行时被解析。以下是对函数 foo() 的调用是如何解决的:
不,不可能像您预期的那样执行此操作。
来自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 一样,它不是很优雅,但它提供了您正在寻找的行为。
我意识到这个问题有点老了,但是Patchwork是一个最近发布的 PHP 5.3 项目,它支持重新定义用户定义的函数。但是,正如作者所提到的,您将需要使用runkit或php-test-helpers来使用猴子补丁核心/库功能。
正如 jmikola 提到的,如果您想向函数添加代码,Patchwork 是一个很好的解决方案。
这是一篇关于它如何工作的文章:http: //phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/
它带有一些示例代码。我认为phpmyweb版本使用了稍微好一点的代码,因为他不使用eval()的代码,不像patchwork。使用 eval() 时可以缓存操作码。
接受的答案非常好!我将补充一点,您可以将代码放在命名空间括号中,然后重置默认的 GLOBAL-SPACE。
1) rename_function($old_name,$new_name)
2) override_function($old_name, $parameters, $new_func)
很少使用: