PHP - 覆盖现有函数

时间:2011-01-18 14:29:03

标签: php wordpress function

我可以重新声明具有相同名称但代码不同的现有功能吗?或者以某种方式“禁用”旧功能?

我想重新定义一个核心的WordPress函数,但由于插件和主题调用了很多这个函数,我需要保留相同的函数名。

5 个答案:

答案 0 :(得分:7)

您可以使用WordPress挂钩(称为过滤器和操作),然后使用add_filter()功能覆盖您正在使用的功能。

即。

function function_name() {
 //code goes here
}

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

食典委会对此有所帮助。

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

答案 1 :(得分:6)

只需注释旧功能并编写新功能;)

在PHP中,本身无法重新定义或重载(即定义具有相同名称但不同参数的函数)函数。虽然像runkit这样的扩展允许重新定义函数(runkit_function_redefine),但您可能不想使用这些扩展(这些扩展很少安装且大部分不可靠。)

答案 2 :(得分:6)

只有当你使用类似APD的东西来扩展zend引擎时才允许:

<强> Intro

Override Method Docs

注意:Runkit似乎比APD更好,因为它更具体地针对此目的,并允许您将原始方法保持在不同的地址。

答案 3 :(得分:6)

如果还没有定义另一个相同名称,你可以将定义原始函数的块包装在条件检查中(我假设你的意思是Wordpress函数而不是核心PHP函数)

    <?php 
if(!function_exists('function_name')){ 
    //old definition here
    } ?>

然后您可以重新定义上面的内容,同时仍然保留原始内容,如果您需要回滚它。

根据更改的复杂程度以及执行此操作的次数,如果您使用的是PHP 5,则可能还需要查看Namespaces

答案 4 :(得分: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());
    ....
}

显然升级时会产生开销,因为您需要再次将行重新添加到脚本中并且我已成功使用此方法,但现在尝试使用get_terms在wp-includes中执行此操作并点击我正在努力解决或解决的重新启动问题。

我编辑核心的原因是现有核心不能以方便的方式提供多站点要求。

有人刚刚在另一个论坛上建议使用override_function,但手册的措辞似乎只对内置函数有用 - 我认为这意味着PHP内置函数