安裝程式啟動時首先定義兩個關鍵常量:
define('INSIDE', true);
define('INSTALL', true);
INSIDE:防止核心文件被直接訪問的安全標記,所有核心文件開頭均會檢查此常量INSTALL:標識當前處於安裝流程中,影響後續邏輯分支包含防攻擊代碼,並定義 $phpEx = "php" 隱藏 PHP 副檔名,提升安全性。
實際為 common.'.$phpEx 即 common.php,包含大量工具函數。
includeLang('install/install');
includeLang() 定義於 includes/unlocalised.php:
function includeLang($filename, $ext = '.mo') {
global $xnova_root_path, $lang, $user;
$SelLanguage = $user['lang'] ?: DEFAULT_LANG;
include ($xnova_root_path . "language/" . $SelLanguage . "/" . $filename . $ext);
}
支援多語言切換(TC3 版本支援用戶級語言偏好),採用 .mo 格式語言文件。
function gettemplate($templatename) {
global $xnova_root_path;
$filename = $xnova_root_path . TEMPLATE_DIR . TEMPLATE_NAME . '/' . $templatename . ".tpl";
return ReadFromFile($filename);
}
常量定義:TEMPLATE_DIR = 'templates/'、TEMPLATE_NAME = 'OpenGame'
範例:gettemplate('install/ins_body') → templates/OpenGame/install/ins_body.tpl
function parsetemplate($template, $array) {
return preg_replace('#\{([a-z0-9\-_]*?)\}#Ssie', '( ( isset($array[\'\1\']) ) ? $array[\'\1\'] : \'\' );', $template);
}
使用正則表達式將模板中 {VAR_NAME} 格式的佔位符替換為 $array['VAR_NAME'] 的值,實現多語言與動態內容注入。Ssie 修飾符含義:
S:分析模式優化s:單行模式(. 匹配換行)i:不區分大小寫e:將替換部分作為 PHP 代碼執行(注意:PHP 7.0+ 已棄用,建議改用 preg_replace_callback)通過 $page 變量控制流程:
| 步驟 | $page 值 | 核心邏輯 |
|---|---|---|
| 1. 環境檢查與資料庫配置 | 1 | 讀取 ins_form.tpl,顯示資料庫連接表單(主機、數據庫名、表前綴、用戶名、密碼) |
| 2. 連接資料庫與建表 | 2 | 驗證連接 → 寫入 config.php → 執行 includes/databaseinfos.php 中的 SQL 建表語句 |
| 3. 管理員賬號表單 | 3 | 檢查上步結果 → 顯示管理員創建表單(用戶名、密碼、Email) |
| 4. 創建管理員與完成 | 4 | 驗證輸入 → 創建管理員記錄 → 安裝完成 |
function display($page, $title = '', $topnav = true, $metatags = '', $AdminPage = false) {
global $link, $game_config, $debug, $user, $planetrow;
// 區分普通用戶與管理員頁首
$DisplayPage = $AdminPage ? AdminUserHeader($title, $metatags) : StdUserHeader($title, $metatags);
// 頂部導航欄
if ($topnav) $DisplayPage .= ShowTopNavigationBar($user, $planetrow);
// 主內容區
$DisplayPage .= "\n" . $page . "\n \n";
// Debug 輸出(權限 1 或 3 且開啟 debug)
if (($user['authlevel'] == 1 || $user['authlevel'] == 3) && $game_config['debug'] == 1) {
$debug->echo_log();
}
$DisplayPage .= StdFooter();
if (isset($link)) @mysql_close($link);
echo $DisplayPage;
die();
}
該函數整合了頁首、導航、內容、頁尾,並處理資料庫連接關閉與腳本終止,是典型的「頁面控制器」模式。
preg_replace_callbackglobal 使用,建議採用依賴注入容器重構系列導航:第一部分:架構概覽 | 第二部分:安裝流程 | 第三部分:用戶註冊 | 第四部分:登錄與主界面