【问题标题】:PHP: How to solve 'Cannot redeclare loadModule function'PHP:如何解决“无法重新声明 loadModule 函数”
【发布时间】:2012-05-10 12:16:53
【问题描述】:

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

该文件通常可以正常工作,但是当 m 将此文件包含在子目录页面中时会发生错误。像这样……

包括'../includes/init.php';

我收到了这个致命错误:Cannot redeclare 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 上找到的所有案例从一开始就无法正常工作,但只有在包含在子目录中的情况下才会出现此问题。

【问题讨论】:

    标签: php function fatal-error


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      function_exists 需要在参数两边加上引号:

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

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

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

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

      【讨论】:

      • 抱歉延迟回复。 include_once 也不起作用...我还在其他地方检查了 loadModule 定义...我认为问题出在包含路径上...无论如何感谢您的帮助。
      • 好的。检查包含init.php 文件的所有位置,并将它们的全部 更改为include_once 或require_once
      猜你喜欢
      • 2012-06-26
      • 2012-06-11
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 2011-09-12
      相关资源
      最近更新 更多