我有一个函数(从文件的顶部开始,这就是它的样子):

<?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)
in
/Applications/MAMP/htdocs/question-air/includes/functions.php
第13行


我不知道指出为什么或如何发生这种错误。有什么想法吗?

#1 楼

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


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

为了帮助您解决第三点,一种解决方案是在包含您的函数时使用include_once而不是include functions.php文件-因此不能多次包含。

评论


胡;我想指出的行号不是“精确”的; ;或者,作为预防措施:您确定要查看“正确的”文件吗?

– Pascal MARTIN
09年12月23日在16:40

这是唯一具有generate_salt()函数的文件。

–渔夫
09年12月23日在16:42

这意味着它可能被多次包含

– Pascal MARTIN
09年12月23日在16:45

是的,我想就是这样-如何解决它,我不知道,因为我对这个项目的设置非常糟糕。我认为应该重新启动。

–渔夫
09年12月23日在16:47

在这种情况下,使用include_once而不是include(和require_once而不是require)通常会有所帮助:这样,PHP本身可以确保文件不被多次包含

– Pascal MARTIN
09年12月23日在16:52

#2 楼

解决方案1 ​​

不要在循环内声明函数(例如foreachforwhile ...)!在它们之前声明。

解决方案2

您仅应包含该文件(其中存在该功能)一次。因此,include ("functions.php");
使用:include_once("functions.php");

解决方案3

如果以上方法均无济于事,则在函数声明之前添加检查以免重新声明:

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


#3 楼

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

#4 楼

您可以先检查函数名称是否不存在,然后再编写函数
通过

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


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

#5 楼

就我而言,这是因为另一个函数内部的函数!一旦我移出函数,错误就消失了,一切都按预期进行。

此答案说明了为什么不应该在函数内部使用函数。

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

评论


在函数中包含一个函数有什么问题?

– BSUK
16 Dec 9'在16:29

这个答案帮助我

–David Addoteye
18/12/5在3:43

那就是我的问题的解释。

–mach128x
4月2日21:40

#6 楼

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

#7 楼

出现该错误的另一个可能原因是您的函数与另一个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中存在。

#8 楼

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

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

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


因此使用:

$salt = $generate_salt();


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

评论


这真是太好了,您绝对让我度过了<3

– AlexHighHigh
19 Mar 8 '19 at 13:57

@AlexHighHigh很酷,它看起来是如此明显,但是没有人说任何话。

– Staplerfahrer
19 Mar 9 '19 at 22:56

我会在某个时候详细说明它,但是现在我将其保存在我有用的代码片段的lil魔术库中,以便稍后再使用:freshlondon.biz/lambda-expression

– AlexHighHigh
19 Mar 10 '19 at 0:35

#9 楼

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

require_once对于您正在使用的文件也很有用重新尝试包含是必不可少的。

#10 楼

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

#11 楼

由于您提供的代码未明确包含任何内容,或者包含两次,或者(如果脚本是代码的入口点),则必须在网络服务器config / php.ini中设置自动前缀或者,您已经加载了定义功能的模糊扩展。

#12 楼

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

例如:

class ExampleReDeclare {}

// some code here

class ExampleReDeclare {}


第二个ExampleReDeclare引发错误。

#13 楼

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

#14 楼

我想补充一下我的2分经验,这可能对许多人有帮助。
如果在循环(for,foreach和while)中声明一个函数,您将遇到此错误消息。

#15 楼

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

#16 楼

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


您在两个文件中定义了相同的功能
,或者您在同一文件中的两个位置中定义了相同的功能
其中两次定义了您的函数(因此,似乎两次定义了函数)

我认为您在包含该文件的脚本的第3位置面临的问题不止一次。您可以通过使用require_once而不是requireinclude_once而不是include来解决此问题,以包括functions.php文件-因此不能多次包含它。

#17 楼

否则无法在循环中创建函数



,例如

for($ i = 1; $ i <5; $ i ++)
{
function foo()
{
echo'something';
}
}


//它将显示有关重新声明的错误