PHP - 覆盖现有函数[重复]

Posted

技术标签:

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

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

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

【问题讨论】:

请记住,这可能会给进一步的 wordpress 更新带来麻烦... 如果您只是在编写插件或主题,您不应该触及核心恕我直言。或许您可以告诉我们您想要完成的工作,以便我们为您提供帮助? Redefine Built in php Functions 和 Redefining PHP 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 内置函数

【讨论】:

以上是关于PHP - 覆盖现有函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何附加到PHP中的现有数组值[重复]

如何从现有格式转换php中的日期格式[重复]

在本地主机上运行现有 PHP 网站时出现空白屏幕 [重复]

如何检查现有条目(2个方法)[重复]

将值传递给makefile中的现有变量[重复]

PHP关联数组重复键