gak*_*gak 17 php monkeypatching function
你可以用Python做到这一点,但它可以用PHP吗?
>>> def a(): print 1
...
>>> def a(): print 2
...
>>> a()
2
Run Code Online (Sandbox Code Playgroud)
例如:
<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
Run Code Online (Sandbox Code Playgroud)
Sil*_*u G 14
这有点晚了,但我只想指出,自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
?>
Run Code Online (Sandbox Code Playgroud)
与runkit一样,它不是很优雅,但它提供了您正在寻找的行为.
我意识到这个问题有点陈旧,但Patchwork是最近发布的PHP 5.3项目,它支持重新定义用户定义的函数.但是,正如作者所提到的,你需要使用runkit或php-test-helpers来修补核心/库函数.