繁体   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