ThinkPHP 3.0 精簡了啟動流程,框架核心文件 ThinkPHP.php 已自動執行應用初始化。若在入口文件中手動調用 App::run(),會導致應用執行兩次,造成頁面內容重複輸出、數據庫操作重複執行等嚴重問題。
<?php
define('APP_NAME', 'Admin');
define('APP_PATH', './Admin/');
define('THINK_PATH', './ThinkPHP/');
require THINK_PATH . 'ThinkPHP.php'; // 核心文件內部已自動運行
App::run(); // ❌ 錯誤:手動再次觸發運行流程
?>
<?php
define('APP_NAME', 'Admin');
define('APP_PATH', './Admin/');
define('THINK_PATH', './ThinkPHP/');
require THINK_PATH . 'ThinkPHP.php'; // ✅ 核心文件包含自動啟動邏輯
// App::run(); // 註釋或刪除此行
?>
查看 ThinkPHP/ThinkPHP.php 源碼 (簡化版):
<?php
// ThinkPHP.php 核心入口
defined('THINK_PATH') or exit();
// 註冊自動加載
spl_autoload_register('think_autoload');
// 實例化核心應用類並運行
$app = new App();
$app->run(); // 框架內部已自動調用
// 如果用戶再次調用 App::run(),將導致雙重執行
?>
| 版本 | 入口文件標準寫法 | 是否需手動 run() |
|---|---|---|
| ThinkPHP 2.x | require 'ThinkPHP.php'; App::run(); | 是 |
| ThinkPHP 3.0/3.1/3.2 | require 'ThinkPHP.php'; | 否 (核心已自動運行) |
| ThinkPHP 5.0+ | require 'vendor/autoload.php'; $app = new think\App(); $app->run(); | 是 (但需實例化 App) |
| ThinkPHP 6.0+ | require 'vendor/autoload.php'; (public/index.php 由框架生成) | 框架自動處理 |
{volist} 或 foreach。<?php
// 入口文件標準模板 (ThinkPHP 3.2)
define('APP_DEBUG', true); // 開發模式
define('APP_NAME', 'Home'); // 項目名
define('APP_PATH', './Application/'); // 模塊目錄
define('BIND_MODULE', 'Home'); // 綁定模塊 (可選)
define('THINK_PATH', './ThinkPHP/'); // 框架核心目錄
// 載入框架核心 (自動運行)
require THINK_PATH . 'ThinkPHP.php';
// 生產環境建議關閉調試、啟用緩存
// define('APP_DEBUG', false);
// define('HTML_CACHE_ON', true);
?>