0

私はWebプロジェクトに取り組んでおり、基本的にデータベース接続を初期化し、spl_autoload_registerを使用してすべてのクラスをロードするinit.phpというファイルがあります。これはページの先頭に含まれています。

通常、ファイルは正常に動作しますが、このファイルをサブ ディレクトリ ページに含めるとエラーが発生します。このような ...

'../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 で見つけたすべてのケースは最初から機能していませんでしたが、サブディレクトリ内に含まれている場合にのみこの問題が発生します。

4

2 に答える 2

2

ファイルを複数回含めると、混乱が生じます。

このような問題の最善の解決策は、どのファイルがどの.

include('whatever.php')コードをスコープに入れる必要があるたびに単にダンプしないでください。一歩下がって、インクルード戦略を設計してください。これを正しく行えば、二度とこのような問題は発生しません。

include_onceそうでない場合は、代わりにを使用すると、includeこれらの問題を回避するのに役立ちます。

于 2012-05-10T12:21:07.597 に答える
2

function_existsパラメータを引用符で囲む必要があります。

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

主な問題は、あなたが含めている他のファイルがおそらく含まれていることだと思います'../includes/init.php'

使用include_once ('../includes/init.php');して、動作するかどうかを確認します。

また、このアプリのすべてのコード ベースを検索してfunction loadModule(念のため可変数のスペースを使用して)、他の場所に定義がないことを確認します。loadModule

于 2012-05-10T12:21:36.733 に答える