是可以更换(monkeypatch)PHP职能?
-
22-08-2019 - |
题
你可以这样做在蟒蛇,但是它可能在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
解决方案
这是一个 位 晚,但我只想指出,由于PHP5.3,它实际上是可能的替代内部职能不使用PHP扩展。
诀窍是,你可以重新确定内部PHP功能内部的名称空间。这是基于种方式PHP does名的决议的功能:
内部namespace(说\B),呼吁不合格的功能是决心在运行时间。这里是怎么呼叫function foo()是解决:
- 它看起来一个函数,从目前的名字空间:A\B\foo().
- 它试图找到并呼吁全球function 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,这是不是很优雅,但它给你正在寻找的行为。
我认识到这一问题是有点陈旧,但碎料是一个recently-发布PHP 5.3的项目,支持用户自定义的功能重新定义。虽然,因为作者提到,你将需要诉诸 runkit 一>或 PHP-测试助手来猴-patch核/库函数。
如jmikola提到的,拼接是一个很好的解决方案,如果要添加的代码的功能。
下面是关于它是如何工作的文章: http://phpmyweb.net/2012/ 4月26日/写-AN-真棒-插件-系统级的PHP /
它配备了一些示例代码。我认为phpmyweb版采用了稍微好一点的代码,因为他不使用eval()'d代码,不像错落有致。可以使用的eval()时缓存操作码。
接受的答案是优良!!!我只想补充一点,你可以把你的代码中命名空间括号然后默认GLOBAL-SPACE被重置了。
一些其它方式:
1) rename_function($ OLD_NAME,$ NEW_NAME)
2) override_function($ OLD_NAME,$参数,$ new_func)一>
和很少使用的: