PHP - 覆盖现有函数

19

我能否重新声明一个已经存在的函数,使用相同的名称但是不同的代码?或者以某种方式“禁用”旧函数?

我想重新定义一个核心的WordPress函数,但由于插件和主题经常调用该函数,因此我需要保持相同的函数名称。


请记住,这可能会在以后的WordPress更新中造成麻烦... - Tobias
如果你只是在写插件或主题,我认为你不应该去触碰核心代码。也许你可以告诉我们你想达成什么目的,这样我们就可以帮助你了吗? - Phill Pafford
可能是Redefine Built in PHP FunctionsRedefining PHP Function的重复问题。我相信你也使用了搜索功能,并在不到一分钟的时间内找到了它们。请指出它们为什么不能解决你的问题。 - Gordon
5个回答

9
您可以使用WordPress钩子(称为过滤器和动作),然后使用add_filter()函数覆盖您正在使用的函数。
例如:
function function_name() {
 //code goes here
}

$hook = 'get_options'; // the function name you're filtering
add_filter( $hook, 'function_name' );

使用Codex可以很好地解决这个问题。

http://codex.wordpress.org/Plugin_API/Filter_Reference


2
显然,这仅适用于使用apply_filter的代码。其他任何东西都无法操作。因此,此解决方案取决于原始代码首先利用过滤器。尽管越来越多的WordPress代码(包括插件)都在这样做,但并非所有代码都适合这种方法。不幸的是。仍然+1指出它。 - 0xC0000022L

6

只有使用类似于APD这样的东西才能扩展Zend引擎以允许这样做:

介绍

覆盖方法文档

注意:Runkit似乎比APD更好,因为它更专门用于此目的,并且允许您在不同的地址上保留原始方法。


6
您可以在条件检查中包装定义原始函数的代码块,以检查是否已经定义了同名的另一个函数(我假设您指的是 Wordpress 函数而不是核心 PHP 函数)。
    <?php 
if(!function_exists('function_name')){ 
    //old definition here
    } ?>

如果需要回滚到原始状态,您可以在保留原始状态的同时重新定义它。

根据更改的复杂程度和重复次数,如果您使用的是PHP 5,还可以考虑使用命名空间


WordPress本身使用一些函数(如wp_mail())来实现此功能。这使得插件可以覆盖它们,但最好尽可能使用钩子。请参考此处 - Ian Dunn

5

只需注释掉旧函数并编写新函数即可 ;)

在PHP中,本地无法重新定义或重载(即使用不同参数定义具有相同名称但不同参数的函数)。但是,有一些扩展可以重新定义函数(runkit_function_redefine),例如runkit,但您可能不想使用这些扩展(这些扩展很少安装且大多不可靠)。


1
这可能适用于我的网站,但如果我正在编写一个公共插件或主题,我不能那样做... - Alex

3

我想尝试做的解决方案是这样的:

function suffusion_get_image($options = array()) {
    include_once ABSPATH.'wp-content/themes/suffusion-child/functions/media.php';
    return childtheme_overide_suffusion_get_image($options = array());
    ....
}

显然,在升级时会有一些额外的工作,因为您需要再次将行添加到脚本中。迄今为止,我已经成功使用了这种方法,但现在正在尝试在 wp-includes 中使用“get_terms”,遇到了一个重新声明的问题,我正在努力解决或解决此问题。
我编辑核心的原因是,现有的核心并不能以便捷的方式满足多站点需求。
另一个论坛上的某人建议使用“override_function”,但手册措辞表示它似乎仅适用于内置函数,我理解那意味着 PHP 内置函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接