20

您可以在 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
4

6 回答 6

14

有点晚了,但我只想指出,从 PHP 5.3 开始,实际上可以在不使用 PHP 扩展的情况下覆盖内部函数。

诀窍是您可以在命名空间内重新定义内部 PHP 函数。它基于 PHP 对函数进行名称解析的方式:

在命名空间内(比如 A\B),对不合格函数的调用在运行时被解析。以下是对函数 foo() 的调用是如何解决的:

  1. 它从当前命名空间中寻找一个函数:A\B\foo()。
  2. 它试图找到并调用全局函数 foo()
于 2013-08-08T07:23:23.043 回答
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 一样,它不是很优雅,但它提供了您正在寻找的行为。

于 2009-02-10T00:25:18.693 回答
5

我意识到这个问题有点老了,但是Patchwork是一个最近发布的 PHP 5.3 项目,它支持重新定义用户定义的函数。但是,正如作者所提到的,您将需要使用runkitphp-test-helpers来使用猴子补丁核心/库功能。

于 2010-11-02T14:45:37.853 回答
1

有点儿。请参阅http://dev.kafol.net/2008/09/php-redefining-deleting-adding.html

于 2009-02-10T00:25:49.177 回答
1

正如 jmikola 提到的,如果您想向函数添加代码,Patchwork 是一个很好的解决方案。

这是一篇关于它如何工作的文章:http: //phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

它带有一些示例代码。我认为phpmyweb版本使用了稍微好一点的代码,因为他不使用eval()的代码,不像patchwork。使用 eval() 时可以缓存操作码。

于 2012-04-27T09:46:57.710 回答
0

接受的答案非常好!我将补充一点,您可以将代码放在命名空间括号中,然后重置默认的 GLOBAL-SPACE。

其他一些方法:

1) rename_function($old_name,$new_name)

2) override_function($old_name, $parameters, $new_func)

很少使用:

3) runkit_function_rename(...)

4) runkit_function_redefine(...)

于 2016-11-17T20:35:46.647 回答