来自2个不同库的php中的函数名冲突

时间:2009-06-20 00:49:57

标签: php function

我有2个'库',我需要将它们包含在同一页面上。简单的机器论坛和Wordpress。

但两者都具有相互冲突的函数is_admin()。

Fatal error: Cannot redeclare is_admin() (previously declared
in /home/site.com/wordpress/wp-includes/query.php:100)in /home/site.com/smf/Sources/Security.php on line 82)

解决这个问题的最佳方法是什么?因为我不想将对一个库的所有调用修改为is_admin2(),例如。

5 个答案:

答案 0 :(得分:2)

我相信你没有太多的选择,只能重命名函数,或者围绕一个类包装所有函数。这是PHP的问题< = 5. *:没有名称空间,开发人员通常更喜欢编写一个充满松散函数的脚本,而不是使用面向对象的方法。

答案 1 :(得分:1)

我会咬住子弹手动重命名为较小的库的每个函数调用(我猜这将是论坛之一)。祝你好运。

答案 2 :(得分:1)

将功能重命名为is_admin_wp()is_admin_smf()。然后,定义您自己的is_admin()函数。这可能只是一个简单的包装器:

function is_admin() {
    // from what function is_admin was called?
    list (, $last) = debug_backtrace();
    if (strpos($last['file'], 'wordpress') >= 0) {
        $fn = 'is_admin_wp';
    } else {
        $fn = 'is_admin_smf';
    }
    $args = func_get_args();
    return call_user_func_array($fn, $args);
}

答案 3 :(得分:0)

一种可能性是使用PHP 5.3,它支持命名空间。我不知道实现的细节,但它应该使您能够将库包装在不同的命名空间中。

不幸的是5.3仍未达到稳定版本。如果您不能/不想使用它,我看到的唯一不涉及重命名的选项是:创建单独的两个PHP脚本,在不同的解释器中启动它们,并让它们以某种方式进行通信(管道, socket,tempfile)。

答案 4 :(得分:0)

幸运的是,这是简单机器论坛中is_admin的删除中发现的评论。

// Grudge chickens out and puts this in for combatibility. This will be ripped out on day one for SMF 1.2 though ;)

似乎不需要它...有点烦人的是,我每次升级时都必须记住删除它...