簡體   English   中英

PHP:如何解決“無法重新聲明loadModule函數”

[英]PHP: How to solve 'Cannot redeclare loadModule function'

我正在一個Web項目上工作,我有一個名為init.php的文件,該文件基本上初始化數據庫連接並使用spl_autoload_register加載所有類,該文件包含在頁面的開頭。

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

包括'../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等n DB數據。

我嘗試使用

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

但這給了class Sql not found致命錯誤...基本上是不加載類。

我試圖將函數的名稱更改為loadModule_new但這給出了cannot redeclare錯誤。

我在StackOverflow上發現的所有情況從一開始都不起作用,但是只有在包含在子目錄中的情況下才出現此問題。

您多次包含該文件,隨之而來的是混亂。

解決此類問題的最佳方法是制定一個清晰的計划,以明確負責哪個文件的文件

每當您需要將一些代碼引入作用域時,都不要轉儲include('whatever.php') 退后一步, 設計您的包含策略。 如果正確執行此操作,您將再也不會遇到此類問題。

失敗的話,使用include_once而不是include應該可以幫助您解決這些問題。

function_exists期望在參數周圍加上引號:

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

我認為主要問題是您要包含的其他文件可能包含'../includes/init.php'

使用include_once ('../includes/init.php'); 看看是否可行。

另外,在該應用的所有代碼庫中搜索function loadModulefunction loadModule ,以可變數量的空格),以確保在其他地方都沒有關於loadModule的定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM