Fatal error: Cannot redeclare в одной и той же строке

BasCreator

Новичок
При объявлении функции столкнулся с такой ошибкой:
Fatal error: Cannot redeclare relative_date() (previously declared in index.php:45) in index.php on line 45
Функция не может быть переобъявлена т.к. уже объявлена в этой же строке? О_О Ниже приведён код (начало c строки), как видно, функция объявляется всего единожды. В других файлах она объявляться не могла т.к. это первое её упоминание во всём теле сайта.

PHP:
function relative_date($reltime) {
$today = strtotime(date('M j, Y'));
$reldays = ($reltime - $today)/86400;
if ($reldays >= 0 && $reldays < 1) {
return 'Сегодня';
} else if ($reldays >= 1 && $reldays < 2) {
return 'Завтра';
} else if ($reldays >= -1 && $reldays < 0) {
return 'Вчера';
}
if (abs($reldays) < 182) {
return date('l, j F',$ads->get('time'));
} else {
return date('l, j F, Y',$ads->get('time'));
}
}
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Предполагаю, что где-то файл инклудится сам в себя.
 

С.

Продвинутый новичок
Не обязательно сам в себя, а просто инклудится дважды.
 

BasCreator

Новичок
Но без этого куска кода всё работает нормально. Или это вполне возможно даже при нормальной работе?
 

С.

Продвинутый новичок
Инклудить код два и более раз можно. Но если в этом коде оказывается объявление функции, то опаньки.
 

BasCreator

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

С.

Продвинутый новичок
Ответ неверный! Правильный ответ: "Спасибо, буду инклудить файлы с объявлениями функций один раз".
 

BasCreator

Новичок
Сайт изначально писался не мной, так что разобраться с инклудами будет куда сложнее, чем написать этот кусок кода без объявления функции.
 

BasCreator

Новичок
Да, сложнее. Сайт написан на самопальной cms и имеет довольно сложную структуру.
 

radioheaded

PHP нуб
Да, сложнее, сайт написан на самопальной cms и имеет довольно сложную структуру.
Ок, поясню: вы утверждаете, что собираетесь переписать этот кусок кода, вынеся код из функции (то есть, избавиться от ее объявления), я вам предлагаю обернуть объявление в function_exists, как это делали в старые добрые ламповые времена. Как считаете, что проще?
 

SiZE

Новичок
BasCreator, выше подсказали. Самое простое сделать так:

PHP:
if ( !function_exists('relative_date') ) {
 /* здесь объявляем функцию */
}
 

Ярослав

Новичок
а правильнее распечатать в файле с функцией трейс, найти того, кто инклюдит повторно, заменить на require_once
Не всегда

Там может быть кусок HTML который нужно вывести на странице. А require_once выведет только первый раз. Поэтому в данном случаи, function_exists для автора лучший костыль
 

weregod

unserializer
Там может быть кусок HTML который нужно вывести на странице. А require_once выведет только первый раз. Поэтому в данном случаи, function_exists для автора лучший костыль
соглашусь, в некоторый говнокод легче добавить ещё говнокода ;)
 
Сверху