2017-01-04 2 views
1

У меня есть вспомогательные функции helper.php с содержимым:фатальная ошибка PHP: `не переобъявить function` при использовании include_once

<?php 
session_start(); 

function get_result($dbh, $sql) { 
    //return mssql_query($sql); 
    return $dbh->query($sql); 
} 
?> 

, который включен в двух файлах (information.php и commercial.php) с использованием:

include_once 'helper.php' 

К сожалению, это порождает слегка запутанное сообщение об ошибке:

PHP Fatal error: Cannot redeclare get_result() (previously declared in helper.php:4) in helper.php on line 4 

Я понимаю, что я не могу переопределять функции, поэтому я использую конструкцию include_once, но, тем не менее, она пытается повторно использовать функцию в любом случае. Зачем?

Если это помогает; Я использую Mustache PHP, и все три файла находятся в папке partials.

+0

Какое содержимое 'helper.php'? Вы указали содержимое 'help.php'. Кроме того, вы уверены, что каждое включение 'helper.php' выполняется через' include_once'? –

+0

@DaanMeijer - извините, это была опечатка, это должно быть 'helper.php'. исправлено! – nluigi

+0

Отлично :) Теперь, мой другой вопрос: вы уверены, что каждое включение происходит через 'include_once'? –

ответ

2

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

Из инструкции:

include_once may be used in cases where the same file might be included and evaluated more than once during a particular execution of a script, so in this case it may help avoid problems such as function redefinitions, variable value reassignments, etc.

наклонным означает, что функция в том же файле, а не в разных файлах.

+0

Принимая это как ответ, потому что он отвечает на мой фактический вопрос (почему это происходит?) The best – nluigi

1

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

Вы могли бы попробовать что-то вроде:

if (! function_exists('get_result')) { 

    function get_result() 
    { 
     //your code 
    } 
} 

Надеется, что это помогает!

+0

Я использовал это, чтобы обойти обновленную редакцию, но это кажется быстрым решением для меня ... На данный момент я доволен этим, так как это помогает решить проблему, и я нахожусь в крайнем сроке, но я буду пересматривать это в будущем и видеть если я могу сделать это, не прибегая к «исправлению», – nluigi

Смежные вопросы