0

我正在开发一个 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 等数据库数据....

我尝试使用

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 expects quote marks around the parameter:

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

I think the main problem is that some other file you're including is probably including '../includes/init.php'

Use include_once ('../includes/init.php'); and see if it works.

Also, search all your code base for this app for function loadModule (with a variable number of spaces just in case) to make sure that you've not got a definition anywhere else for loadModule

于 2012-05-10T12:21:36.733 回答