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 - 覆盖现有函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章