PHP:如何解决'无法重新声明loadModule函数'

时间:2012-05-10 12:16:54

标签: php function fatal-error

我正在开发一个Web项目,我有一个名为init.php的文件,它基本上初始化数据库连接,并使用包含在页面开头的spl_autoload_register.Its加载所有类。

该文件通常工作正常,但是当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数据库数据......

我尝试使用

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

但是这会给class Sql not found致命错误......基本上没有加载类。

我尝试将该函数的名称更改为loadModule_new,但这样做的错误为cannot redeclare

我在StackOverflow上找到的所有案例都没有从启动开始工作,但仅在包含在子目录中时才会出现此问题。

2 个答案:

答案 0 :(得分:2)

您多次包含该文件,然后出现混乱。

此类问题的最佳解决方案是有一个清晰的计划,关于哪个文件负责包含哪些

每次需要将一些代码放入范围时,不要只转储include('whatever.php')。退后一步,设计您的包含策略。如果你这样做,你将再也不会遇到这样的问题了。

如果失败,使用include_once代替include可以帮助您解决这些问题。

答案 1 :(得分:2)

function_exists期望参数周围的引号:

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

我认为主要问题是您所包含的其他文件可能包括'../includes/init.php'

使用include_once ('../includes/init.php');查看是否有效。

此外,搜索function loadModule此应用的所有代码库(以防万一的可变数量的空格),以确保您在loadModule <的其他任何位置都没有定义/ p>