【问题标题】:"Fatal error: Cannot redeclare <function>"“致命错误:无法重新声明 <function>”
【发布时间】:2010-12-29 13:24:39
【问题描述】:

我有一个函数(这正是它的显示方式,从我的文件顶部开始):

<?php
//dirname(getcwd());
function generate_salt()
{
    $salt = '';

    for($i = 0; $i < 19; $i++)
    {
        $salt .= chr(rand(35, 126));
    }

    return $salt;
}
...

由于某种原因,我不断收到错误消息:

致命错误:无法重新声明 generate_salt() (之前声明过 在 /Applications/MAMP/htdocs/question-air/includes/functions.php:5) 在 /Applications/MAMP/htdocs/question-air/includes/functions.php 在第 13 行

我无法弄清楚为什么会发生这种错误或如何发生这种错误。有什么想法吗?

【问题讨论】:

    标签: php include


    【解决方案1】:

    您必须停用精简版才能运行专业版。

    【讨论】:

    • 我相信您是否知道为什么会这样。我会提高每个人对您的解决方案的理解。
    【解决方案2】:

    我最近弹出了这个问题,其中一个函数在同一个文件中定义之前被调用,并且它没有将返回值分配给变量。为要分配的返回值添加一个 var 以使错误消失。

    【讨论】:

      【解决方案3】:

      我想添加我的 2 美分体验,可能对你们中的许多人有所帮助。

      如果你在循环中声明一个函数(for、foreach、while),你会遇到这个错误信息。

      【讨论】:

        【解决方案4】:

        解决方案 1

        不要在循环内声明函数(如foreachforwhile...)!在他们面前宣布。

        解决方案 2

        您应该只包含一次该文件(其中存在该函数)。所以,
        而不是:include ("functions.php");
        使用:         include_once("functions.php");

        解决方案 3

        如果以上都没有帮助,在函数声明之前,添加一个检查以避免重新声明:

        if (!function_exists('your_function_name'))   {
          function your_function_name()  {
            ........
          }
        }
        

        【讨论】:

          【解决方案5】:

          如果您遇到 Wordpress 主题问题,可能是因为虽然您已在 wp_options 表中重命名了主题,但您并没有重命名样式表。我为此苦苦挣扎。

          【讨论】:

            【解决方案6】:

            或者你不能在循环中创建函数

            • 比如

              for($i=1;$i

            foo();
            //它会显示关于重新声明的错误

            【讨论】:

              【解决方案7】:

              我不喜欢function_exists('fun_name'),因为它依赖于将函数名转换为字符串,另外,您必须将其命名两次。可以通过重构轻松打破。

              将你的函数声明为 lambda 表达式(我还没有看到提到过这个解决方案):

              $generate_salt = function()
              {
                  ...
              };
              

              这样使用:

              $salt = $generate_salt();
              

              然后,在重新执行上述 PHP 代码时,该函数会简单地覆盖之前的声明。

              【讨论】:

              • 这太棒了,你绝对让我开心
              • @AlexHighHigh 很酷,看起来很明显,但没有人说什么。
              • 我会在某个时候详细说明它的描述,但现在我将它保存在我的有用 sn-ps 的 lil 魔法库中,以便以后返回:freshlondon.biz/lambda-expression跨度>
              【解决方案8】:

              出现该错误的另一个可能原因是您的函数与另一个 PHP 内置函数同名。例如,

              function checkdate($date){
                 $now=strtotime(date('Y-m-d H:i:s'));
                 $tenYearsAgo=strtotime("-10 years", $now);
                 $dateToCheck=strtotime($date);
                 return ($tenYearsAgo > $dateToCheck) ? false : true;
              }
              echo checkdate('2016-05-12');
              

              checkdate 函数在 PHP 中已经存在。

              【讨论】:

                【解决方案9】:

                在我的情况下,这是因为另一个函数内部的函数!一旦我移出该功能,错误就消失了,一切都按预期工作。

                This answer 解释了为什么你不应该使用 function inside function

                这可能会对某人有所帮助。

                【讨论】:

                • 在函数中包含函数有什么问题?
                • 这个答案对我有帮助
                • 这就是我的问题的解释。
                【解决方案10】:

                此错误表示您的函数已定义;这可能意味着:

                • 您在两个文件中定义了相同的函数
                • 或者你在同一个文件的两个地方定义了相同的函数
                • 或者定义函数的文件被包含两次(因此,函数似乎被定义了两次)

                我认为您在包含此文件的脚本中多次遇到的问题位于第三位。因此,您可以通过使用require_once 而不是requireinclude_once 而不是include 来解决它,以包含您的@ 987654327@ 文件——因此它不能被多次包含。

                【讨论】:

                  【解决方案11】:

                  表示你已经创建了一个同名的类。

                  例如:

                  class ExampleReDeclare {}
                  
                  // some code here
                  
                  class ExampleReDeclare {}
                  

                  第二个 ExampleReDeclare 抛出错误。

                  【讨论】:

                    【解决方案12】:

                    当我的 *.php.bak(由记事本自动创建)被包含在编译中时,我的行为很奇怪。从文件夹中删除所有 *.php.bak 后,此错误消失了。 也许这会对某人有所帮助。

                    【讨论】:

                      【解决方案13】:

                      您可以在编写函数之前先检查您的函数名称是否不存在 由

                        if (!function_exists('generate_salt'))
                      {
                          function generate_salt()
                          {
                          ........
                          }
                      }
                      

                      或者您可以将函数名称更改为另一个名称

                      【讨论】:

                        【解决方案14】:

                        由于您提供的代码没有明确包含任何内容,要么它被包含两次,要么(如果脚本是代码的入口点)必须在网络服务器配置中设置自动前置 / php.ini 或者你已经加载了一个非常模糊的扩展来定义函数。

                        【讨论】:

                          【解决方案15】:

                          我遇到了同样的问题。最后是双重包含。一个包含在一个名为 X 的文件中。另一个包含在一个名为 Y 的文件中。知道在文件 Y 中我有包含 ('X')

                          【讨论】:

                            【解决方案16】:

                            我建议使用 get_included_files - 正如 Pascal 所说,您要么以某种方式查看了错误的文件,要么此函数已在包含的文件中定义。

                            require_once 在您尝试包含的文件必不可少时也很有用。

                            【讨论】:

                              【解决方案17】:

                              您可能不止一次包含文件functions.php。

                              【讨论】:

                                【解决方案18】:

                                此错误表示您的函数已定义;这可能意味着:

                                • 您在两个文件中定义了相同的函数
                                • 或者你在同一个文件的两个地方定义了相同的函数
                                • 或者定义函数的文件被包含两次(所以,函数似乎被定义了两次)

                                为了帮助解决第三点,一个解决方案是在包含您的 functions.php 文件时使用 include_once 而不是 include - 所以它不能被包含超过一次。

                                【讨论】:

                                • 胡;我想指示的行号不是“精确的”; ;或者,作为预防措施:您确定您正在查看“正确”文件吗?
                                • 这是唯一具有 generate_salt() 函数的文件。
                                • 这意味着它可能被多次包含
                                • 是的,我想就是这样——如何解决它,我不知道,因为我把这个项目设置得很糟糕。我认为可能应该重新启动。
                                • 在这种情况下,使用 include_once 代替 include(以及 require_once 代替 require)通常会有所帮助:通过这种方式,PHP 本身可以确保文件不会被多次包含
                                猜你喜欢
                                • 1970-01-01
                                • 2015-08-29
                                • 2012-06-18
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多