首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决“无法重新声明loadModule函数”的问题

如何解决“无法重新声明loadModule函数”的问题
EN

Stack Overflow用户
提问于 2012-05-10 20:16:54
回答 2查看 831关注 0票数 0

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

该文件通常工作正常,但是当m将该文件包含在子目录页面中时出现错误。像这样..。

我收到这个致命错误:无法重新声明先前在行上声明的loadModue ...

文件内容如下所示:

代码语言:javascript
复制
<?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定义主机、APP_ROOT等n DB数据....

我试着用

代码语言:javascript
复制
if(!function_exists(loadModule)){
       function loadModule(){.....}
    }

但是这给了class Sql not found致命的错误...基本上不加载类。

我尝试将函数的名称更改为loadModule_new,但给出的错误与cannot redeclare相同。

我在StackOverflow上找到的所有案例从一开始就不起作用,但我只有在子目录中包含的情况下才会遇到这个问题。

EN

回答 2

Stack Overflow用户

发布于 2012-05-10 20:21:08

您多次包含该文件,随后就会出现混乱。

对于这类问题的最佳解决方案是有一个清晰的计划,说明哪个文件负责包含哪些内容。

不要在每次需要将一些代码放入作用域时都转储include('whatever.php')。退一步,设计你的包含策略。如果你这样做正确,你就不会再有这样的问题了。

如果做不到这一点,使用include_once而不是include应该可以帮助您解决这些问题。

票数 2
EN

Stack Overflow用户

发布于 2012-05-10 20:21:37

function_exists需要用引号将参数括起来:

代码语言:javascript
复制
if(!function_exists('loadModule')){
       function loadModule(){.....}
    }

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

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

此外,搜索此应用程序的所有代码库以获取function loadModule (为了以防万一,使用可变数量的空格),以确保您在其他任何地方都没有loadModule的定义

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10533785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档