您可以在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
答案 0 :(得分:13)
这是一个位,但我只想指出,自PHP 5.3以来,实际上可以在不使用PHP扩展的情况下覆盖内部函数。
诀窍是您可以在命名空间内重新定义内部PHP函数。它基于PHP为函数命名解析的方式:
在命名空间内(比如A \ B),在运行时解析对非限定函数的调用。以下是对函数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项目,它支持重新定义用户定义的函数。但是,正如作者所提到的,您需要求助于runkit或php-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)
并且很少使用: