[英]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 loadModule
( function loadModule
,以可變數量的空格),以確保在其他地方都沒有關於loadModule
的定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.