【问题标题】:Is there a way to avoid the "redeclared function" fatal error while defining functions within functions in PHP?在 PHP 中定义函数时,有没有办法避免“重新声明的函数”致命错误?
【发布时间】:2010-02-21 05:40:16
【问题描述】:

我一直在我的 Wordpress 页面上实现某个插件 (dtabs),但升级到最新版本后,我发现第二次调用名为 dtab_list_tabs() 的主函数时出现错误。

它的工作方式是,插件会被 include_once'd,但无论您想在布局中放置选项卡多少次,都会调用 main 函数。我有两个这样的电话给dtab_list_tabs()

现在,问题是,无论出于何种原因,开发人员决定直接在dtab_list_tabs() 中包含另一个名为current_tab() 的函数。因为它是在函数中声明的,显然 PHP 会在您第二次调用父函数时尝试重新声明它,这对我来说没有任何意义。

PHP 致命错误:无法重新声明 current_tab()(之前在 .../wp-content/plugins/dtabs/dtabs.php:1638 中声明)在 .../wp-content/ 1638 行的 plugins/dtabs/dtabs.php

该版本的代码位于http://plugins.svn.wordpress.org/!svn/bc/208481/dtabs/trunk/dtabs.php

我想弄清楚的是是否有办法告诉 PHP 是的……它有一个内部函数,据我所知,这是一个完全有效的 PHP 范例,所以不要t 重新声明它并失败。

至于目前的情况,我已经删除了current_tab(),因为它似乎没有被使用。

【问题讨论】:

    标签: php fatal-error


    【解决方案1】:

    您可以使用function_exists() 来测试是否已经定义了具有该名称的函数。如果您使定义有条件( if(something) { function foo() {...} } )php 将仅在满足条件时“评估”定义。

    function foo() {
      if ( !function_exists('bar') ) {
        function bar() {
          echo 'bar ';
        }
      }
    
      bar();
    }
    
    foo();
    foo();
    

    另见:http://docs.php.net/functions.user-defined

    (但我会尽量避免这样的事情)

    【讨论】:

    • 对,但是这个解决方案涉及修改我不一定有权访问的插件代码。我试图看看是否有办法告诉 PHP 不要从声明子函数的函数外部这样失败。不用猜,除非有人找到办法。
    • @Artem Russakovskii:在这种情况下,给开发者发一封电子邮件,然后打他的头。致命错误是致命错误,没有办法绕过致命错误。这是致命的原因......我还没有看到任何人避免死亡。
    • 嘿,实际上,您应该检查 ErrorException php.net/manual/en/class.errorexception.php - 这似乎是将致命错误等转化为异常,然后捕获它们的方法。
    • 我怀疑你是否可以防止 php 使用 ErrorException 解决致命错误。
    【解决方案2】:

    您可以将函数声明包装在 if 语句中。使用function_exists() 查看该函数之前是否已声明过。

    if(!function_exists('current_tab')) {
      function current_tab() {
        myMagicCode();
      }
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这个:

      if (!function_exists('my_function')) {
        function my_function() {
      
        }
      }
      

      function_exists() - 如果给定函数已定义,则返回 TRUE

      【讨论】:

        猜你喜欢
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 2010-11-28
        • 2017-03-11
        • 1970-01-01
        • 2020-05-15
        • 2013-01-25
        • 2012-11-09
        相关资源
        最近更新 更多