首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 網頁遊戲開發學習:Xnova (OGame) 源碼深度解讀(二)安裝流程與模板引擎機制

     編輯:PHP 相關知識

安裝入口:install/index.php 核心邏輯

安裝程式啟動時首先定義兩個關鍵常量:

define('INSIDE', true);
define('INSTALL', true);
  • INSIDE:防止核心文件被直接訪問的安全標記,所有核心文件開頭均會檢查此常量
  • INSTALL:標識當前處於安裝流程中,影響後續邏輯分支

核心文件載入機制

extension.inc:安全與路徑基礎

包含防攻擊代碼,並定義 $phpEx = "php" 隱藏 PHP 副檔名,提升安全性。

common.php:公共基礎庫

實際為 common.'.$phpEx 即 common.php,包含大量工具函數。

語言包載入:includeLang()

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 格式語言文件。

模板引擎核心:gettemplate() 與 parsetemplate()

模板文件獲取

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 驗證輸入 → 創建管理員記錄 → 安裝完成

頁面輸出函數:display()

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(); }

該函數整合了頁首、導航、內容、頁尾,並處理資料庫連接關閉與腳本終止,是典型的「頁面控制器」模式。

技術債務與現代化建議

  1. 正則 /e 修飾符:PHP 7.0+ 移除,需重構為 preg_replace_callback
  2. mysql_* 函數:已棄用,應遷移至 PDO 或 mysqli
  3. 模板引擎:可考慮引入 Twig、Blade 等現代模板引擎
  4. 全局變量依賴:大量 global 使用,建議採用依賴注入容器重構

系列導航:第一部分:架構概覽 | 第二部分:安裝流程 | 第三部分:用戶註冊 | 第四部分:登錄與主界面

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved