你可以这样做在蟒蛇,但是它可能在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()是解决:

  1. 它看起来一个函数,从目前的名字空间:A\B\foo().
  2. 它试图找到并呼吁全球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)

和很少使用的:

3) runkit_function_rename(...)

4) runkit_function_redefine(...)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top