"Неустранимая ошибка: невозможно повторно объявить <function>"
У меня есть функция (это именно так, как кажется, в верхней части моего файла):
<?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/include/functions.php:5) в /Applications/MAMP/htdocs/question-air/include/functions.php в строке 13
Я не могу понять, почему или как такая ошибка может произойти. Есть идеи?
18 ответов
Эта ошибка говорит о том, что ваша функция уже определена; что может означать:
- одна и та же функция определена в двух файлах
- или у вас одна и та же функция, определенная в двух местах в одном файле
- или файл, в котором определена ваша функция, включен два раза (так что, похоже, функция определена два раза)
Чтобы помочь с третьим пунктом, решение будет использовать include_once
вместо include
когда в том числе ваш functions.php
файл - поэтому он не может быть включен более одного раза.
Решение 1
Не объявляйте функцию внутри цикла (например, foreach
, for
, while
...)! Объявите перед ними.
Решение 2
Вы должны включить этот файл (где эта функция существует) только один раз:
использовать: include_once("functions.php");
вместо: include ("functions.php");
Решение 3
Если ничего из вышеперечисленного не помогает, перед объявлением функции добавьте проверку, чтобы избежать повторного объявления:
if (!function_exists('your_function_name')) {
function your_function_name() {
........
}
}
Прежде чем писать функцию, вы можете проверить, не существует ли имя вашей функции или нет.
if (!function_exists('generate_salt'))
{
function generate_salt()
{
........
}
}
ИЛИ вы можете изменить имя функции на другое имя
В моем случае это было из-за функции внутри другой функции! как только я переместил функцию, ошибка исчезла, и все заработало, как и ожидалось.
Этот ответ объясняет, почему вы не должны использовать функцию внутри функции.
Это может помочь кому-то.
У меня было странное поведение, когда мой *.php.bak (который автоматически создавался блокнотом) был включен в компиляцию. После того, как я удалил все *.php.bak из папки, эта ошибка исчезла. Может быть, это будет полезно для кого-то.
Другая возможная причина получения этой ошибки - то, что ваша функция имеет то же имя, что и другая встроенная функция 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.
Мне не нравится function_exists('fun_name')
потому что оно основано на превращении имени функции в строку, плюс, вы должны назвать его дважды. Может легко порвать с рефакторингом.
Объявите вашу функцию как лямбда-выражение (я не видел упомянутое решение):
$generate_salt = function()
{
...
};
И использовать таким образом:
$salt = $generate_salt();
Затем при повторном выполнении указанного PHP-кода функция просто перезаписывает предыдущее объявление.
Я хочу добавить свой опыт в 2 цента, который может быть полезен для многих из вас.
Если вы объявите функцию внутри цикла (for, foreach, while), вы увидите это сообщение об ошибке.
Я бы порекомендовал использовать get_included_files
- как говорит Паскаль, вы либо как-то смотрите на неправильный файл, либо эта функция уже определена в файле, который был включен.
require_once
также полезно, если файл, который вы пытаетесь включить, имеет важное значение.
Если у вас есть проблема с темой Wordpress, это может быть связано с тем, что, хотя вы переименовали тему в своей таблице wp_options, вы не переименовали таблицу стилей. Я боролся с этим.
У меня такая же проблема. И, наконец, это было двойное включение. Один включает в файл с именем X. А другой включает в файл с именем Y. Зная, что в файле Y есть include ('X')
Означает, что вы уже создали класс с тем же именем.
Например:
class ExampleReDeclare {}
// some code here
class ExampleReDeclare {}
Тот второй ExampleReDeclare выдает ошибку.
Недавно у меня появилось это всплывающее окно, в котором функция вызывалась до ее определения в том же файле, и у нее не было возвращенного значения, присвоенного переменной. Добавление переменной для присвоения возвращаемого значения, чтобы ошибка исчезла.
Поскольку предоставленный вами код явно ничего не включает, либо он включается дважды, либо (если сценарий является точкой входа для кода), в веб-сервере config / php.ini должна быть настроена автоподстановка. или, в качестве альтернативы, вы загрузили действительно неясное расширение, которое определяет функцию.
Вам необходимо деактивировать облегченную версию, чтобы запустить версию PRO.
Эта ошибка говорит о том, что ваша функция уже определена; что может означать:
- одна и та же функция определена в двух файлах
- или у вас одна и та же функция, определенная в двух местах в одном файле
- или файл, в котором определена ваша функция, включен два раза (так что, похоже, функция определена два раза)
Я думаю, что ваша проблема в 3-й позиции сценария, включающего этот файл более одного раза. Итак, вы можете решить ее с помощью require_once
вместо require
или же include_once
вместо include
для включения вашего functions.php
файл - поэтому он не может быть включен более одного раза.
Или вы можете создать функцию в цикле
такие как
for($i=1; $i<5; $i++) { function foo() { echo 'кое-что'; } }
Foo ();
// Он покажет ошибку в отношении объявления