«Неустранимая ошибка: невозможно повторно объявить <function>» - PullRequest
32 голосов
/ 23 декабря 2009

У меня есть функция (именно так и выглядит, в верхней части моего файла):

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

Я не могу понять, почему или как такая ошибка может произойти. Есть идеи?

Ответы [ 14 ]

63 голосов
/ 23 декабря 2009

Эта ошибка говорит о том, что ваша функция уже определена; что может означать:

  • одна и та же функция определена в двух файлах
  • или одна и та же функция определена в двух местах в одном и том же файле
  • или файл, в котором определена ваша функция, включен два раза (так что, похоже, функция определена два раза)

Чтобы помочь с третьим пунктом, решение было бы использовать include_once вместо include при включении файла functions.php - поэтому его нельзя включить более одного раза.

42 голосов
/ 18 июля 2013

Раствор 1

Не объявляйте функцию внутри цикла (например, foreach, for, while ...)! Объявите перед ними.

Раствор 2

Вы должны включить этот файл (если эта функция существует) только один раз:
использовать: include_once("functions.php");
вместо: include ("functions.php");

Решение 3

Если ничего из вышеперечисленного не помогает, перед объявлением функции добавьте проверку, чтобы избежать повторного объявления:

if (!function_exists('your_function_name'))   {
  function your_function_name()  {
    ........
  }
}
5 голосов
/ 23 декабря 2009

Возможно, вы включаете файл functions.php более одного раза.

3 голосов
/ 27 июля 2016

Другая возможная причина получения этой ошибки - то, что ваша функция имеет то же имя, что и другая встроенная функция 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.

3 голосов
/ 16 декабря 2013

У меня было странное поведение, когда мой * .php.bak (который автоматически создавался блокнотом) был включен в компиляцию. После того, как я удалил все * .php.bak из папки, эта ошибка исчезла. Может быть, это кому-нибудь пригодится.

3 голосов
/ 03 ноября 2013

вы можете сначала проверить, если имя вашей функции не существует или нет, прежде чем писать функцию

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

ИЛИ вы можете изменить имя функции на другое имя

2 голосов
/ 17 сентября 2015

В моем случае это было из-за функции внутри другой функции! как только я переместил функцию, ошибка исчезла, и все заработало, как и ожидалось.

Этот ответ объясняет, почему вы не должны использовать функцию внутри функции .

Это может кому-нибудь помочь.

1 голос
/ 22 января 2019

Мне не нравится function_exists('fun_name'), потому что оно основано на том, что имя функции превращается в строку, плюс вам нужно назвать его дважды. Может легко порваться с рефакторингом.

Объявите вашу функцию как лямбда-выражение (я не видел упомянутое решение):

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

И используйте таким образом:

$salt = $generate_salt();

Затем при повторном выполнении указанного PHP-кода функция просто перезаписывает предыдущее объявление.

0 голосов
/ 25 марта 2015

Эта ошибка говорит о том, что ваша функция уже определена; что может означать:

  • одна и та же функция определена в двух файлах
  • или одна и та же функция определена в двух местах в одном и том же файле
  • или файл, в котором определена ваша функция, включен два раза (так что, похоже, функция определена два раза)

Я думаю, что вы столкнулись с проблемой на 3-й позиции сценария, включающего этот файл, более одного раза. Итак, вы можете решить ее, используя require_once вместо require или include_once вместо include для включения файла functions.php - поэтому его нельзя включить более одного раза.

0 голосов
/ 21 июня 2014

означает, что вы уже создали класс с тем же именем.

Например:

class ExampleReDeclare {}

// some code here

class ExampleReDeclare {}

Тот второй ExampleReDeclare выдает ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...