PHP - 覆盖现有函数

Ale*_*lex 17 php wordpress function

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

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

小智 7

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

function function_name() {
 //code goes here
}

$hook = 'get_options'; // the function name you're filtering
add_filter( $hook, 'function_name' );
Run Code Online (Sandbox Code Playgroud)

食典委将对此有所帮助.

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

  • 显然只适用于使用 `apply_filter` 的代码。其他任何东西都不能被操纵。所以这个解决方案首先取决于使用过滤器的原始代码。尽管越来越多的 WordPress 代码(包括插件)这样做,但并非所有代码都适合这种方法。很遗憾。仍然+1指出它。 (2认同)

Nik*_*kiC 6

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

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


cor*_*ard 6

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

介绍

覆盖方法文档

注意:Runkit似乎是比APD更好的选择,因为它更加特定于此目的,并允许您将原始方法保持在不同的地址.


Dea*_*ado 6

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

    <?php 
if(!function_exists('function_name')){ 
    //old definition here
    } ?>
Run Code Online (Sandbox Code Playgroud)

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

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