“致命错误:无法重新声明<function>”</function>

时间:2009-12-23 16:34:50

标签: php include

我有一个功能(这正是它从我的文件顶部出现的方式):

<?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行

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

17 个答案:

答案 0 :(得分:62)

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

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

为了帮助解决第三点问题,解决方案是在包含functions.php文件时使用include_once而不是include - 因此不能多次包含它。

答案 1 :(得分:41)

解决方案1 ​​

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

解决方案2

您应该只包含该文件(其中包含该功能):
使用:include_once("functions.php");
而不是:include ("functions.php");

解决方案3

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:3)

在编写函数之前,您可以先检查函数的名称是否存在 通过

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

或者您可以将功能名称更改为其他名称

答案 4 :(得分:3)

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

答案 5 :(得分:3)

获得该错误的另一个可能原因是您的函数与另一个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');

PHP中已存在checkdate函数。

答案 6 :(得分:2)

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

This answer解释了为什么你不应该在函数内使用函数

这可能有助于某人。

答案 7 :(得分:1)

我不喜欢function_exists('fun_name'),因为它依赖于将函数名称转换为字符串,而且,您必须两次命名它。很容易因重构而中断。

将您的函数声明为lambda表达式(我没有提到此解决方案):

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

并因此使用:

$salt = $generate_salt();

然后,在重新执行上述PHP代码时,该函数将覆盖先前的声明。

答案 8 :(得分:0)

我最近弹出这个窗口,在同一文件 中,在定义函数之前先调用了一个函数,并且没有将返回值分配给变量。为要分配的返回值添加一个变量,以消除错误。

答案 9 :(得分:0)

我想补充一下我的2分经验,这可能会对你们中的许多人有所帮助。

如果在循环内(for,foreach,while)声明一个函数,则将遇到此错误消息。

答案 10 :(得分:0)

如果您遇到Wordpress主题问题,可能是因为尽管您已在wp_options表中重命名了该主题,但尚未重命名样式表。我为此感到挣扎。

答案 11 :(得分:0)

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

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

我认为您在第3个位置遇到包含此文件的脚本不止一次的问题。因此,您可以使用require_once代替requireinclude_once而不是{来解决问题{1}}包含您的include文件 - 因此不能多次包含该文件。

答案 12 :(得分:0)

表示您已经创建了一个具有相同名称的类。

例如:

class ExampleReDeclare {}

// some code here

class ExampleReDeclare {}

第二个ExampleReDeclare抛出错误。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

如果您尝试包含的文件必不可少,

require_once也很有用。

答案 16 :(得分:-1)

或者你可以在循环中创建函数

  • 例如

    for($ i = 1; $ i&lt; 5; $ i ++) { function foo() { 回声'某事'; } }

FOO();
//它将显示有关重新声明的错误