2012-05-10 38 views
0

我正在一個web項目上,我有一個名爲init.php的文件,它基本上初始化數據庫連接並加載所有使用spl_autoload_register.Its包含在類的開始頁。PHP:如何解決'不能重新聲明loadModule函數'

該文件通常工作正常,但當m包含此文件在子目錄頁中時發生錯誤。像這樣......

include'../includes/init.php';

我得到這個致命錯誤:不能重新聲明loadModue以前在線聲明....

文件內容如下:

<?php 
    ob_start(); 

    $profile_time = array() ; 
    $profile_time['start_time'] = microtime(TRUE) ; 

    include_once('settings.php') ; 
    //ini_set('display_errors', 'on'); 
    //ini_set('error_reporting', E_ALL); 
    // set correct timezone 
    date_default_timezone_set('Asia/Calcutta'); 

    // Set default encoding for multibyte strings 
    mb_language('uni'); 
    mb_internal_encoding('UTF-8'); 
    mb_http_input('UTF-8'); 
    mb_http_output('UTF-8'); 
    mb_regex_encoding('UTF-8'); 

    function loadModule($className) 
    { 
     if(file_exists(APP_ROOT.'modules/'.$className.'.php')) 
      require_once(APP_ROOT.'modules/'.$className.'.php'); 
    } 

    spl_autoload_register('loadModule'); 

    $profile_time['before_sql_connection_time'] = microtime(TRUE) ; 

    $DB = mysqli_connect($db_data['host'] , $db_data['user'] , $db_data['pass'] , $db_data['db']); 
    Sql::init(array('db' => $DB)); 

    $profile_time['after_sql_connection_time'] = microtime(TRUE) ; 

    @session_start(); 

    if(User::isLoggedIn()) 
     $_user = new User($_SESSION['user_id']); 
    else 
     $_user = new User(0); 
    if(isSet($_SESSION['user_id'])) 
     $user_data = $_user->getDataArray(); 

    ob_end_clean(); 
?> 

的settings.php這個定義HOST,APP_ROOT等ñ DB數據....

我嘗試使用

if(!function_exists(loadModule)){ 
     function loadModule(){.....} 
    } 

而T3他正在給class Sql not found致命錯誤...基本上沒有加載類。

我試着將函數的名字改爲loadModule_new,但是給出了相同的錯誤cannot redeclare

我可以在StackOverflow上找到的所有情況都不是從開始工作,而是隻有在包含在子目錄中時纔會出現此問題。

回答

2

您正在多次包含該文件,並且出現混亂。

這種問題的最佳解決方案是有一個明確的計劃,哪個文件負責包括哪些

每次需要將某些代碼放入作用域時,不要只轉儲include('whatever.php')。退一步,設計您的包括策略。如果你正確地做到這一點,你將永遠不會再遇到這樣的問題。

如果不成功,請使用include_once而不是include來幫助您解決這些問題。

2

function_exists預計引號周圍的參數:

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

我認爲主要的問題是,你包括一些其他的文件可能包括'../includes/init.php'

使用include_once ('../includes/init.php');,看看它是否工作。

此外,搜索所有的代碼庫爲這個應用程序的function loadModule(有以防萬一的空格可變數量),以確保你沒有一個定義,其他地方爲loadModule

+0

對不起回覆延遲。 include_once也沒有工作......我也檢查了其他地方的loadModule定義...我認爲問題是與包含路徑...無論如何感謝您的幫助。 –

+0

好的。檢查包含'init.php'文件的所有地方,並將它們中的所有**改爲include_once或require_once – DaveyBoy

相關問題