【问题标题】:PHP - override existing function [duplicate]PHP - 覆盖现有函数[重复]
【发布时间】:2011-06-11 03:28:17
【问题描述】:

我可以重新声明一个名称相同但代码不同的现有函数吗?还是以某种方式“禁用”旧功能?

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

【问题讨论】:

  • 请记住,这可能会给进一步的 wordpress 更新带来麻烦...
  • 如果您只是在编写插件或主题,您不应该触及核心恕我直言。或许您可以告诉我们您想要完成的工作,以便我们为您提供帮助?
  • Redefine Built in PHP FunctionsRedefining PHP Function 的可能重复项。不到一分钟就找到了这些,所以我相信您使用搜索功能也找到了这些。请指出他们为什么没有解决您的问题。

标签: php wordpress function


【解决方案1】:

您可以使用 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

【讨论】:

  • 显然只适用于使用apply_filter 的代码。其他任何东西根本无法操纵。所以这个解决方案首先依赖于使用过滤器的原始代码。尽管越来越多的 WordPress 代码(包括插件)这样做,但并非所有人都适合这种方法。很遗憾。仍然 +1 指出这一点。
【解决方案2】:

仅当您使用 APD 之类的东西来扩展 zend 引擎以允许这样做时:

Intro

Override Method Docs

注意:Runkit 似乎是比 APD 更好的选择,因为它更具体地用于此目的,并且允许您在不同的地址保持原始方法完整。

【讨论】:

    【解决方案3】:

    只需将旧函数注释掉,然后编写新函数;)

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

    【讨论】:

    • 这可能适用于我的网站,但如果我正在编写公共插件或主题,我就不能这样做......
    【解决方案4】:

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

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

    然后,您可以在上面重新定义它,同时在需要回滚时仍保留原始文件。

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

    【讨论】:

    • WordPress 本身使用a few functions 执行此操作,例如wp_mail()。这使得插件可以覆盖它们,但最好尽可能使用use hooks
    【解决方案5】:

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

    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 内置函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 2012-04-24
      • 1970-01-01
      • 2021-04-17
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多