通路網站首頁 index.php,跟着執行流程走一遍,細節不深究,碰到不太明白的變量,直接var_dump()輸出看看:
1. index.php——首頁入口頁面,版本判定、是否開啟調試、引入 ThinkPHP架構
路徑:‘./index.php‘
判斷PHP版本需是5.3.0以上:version_compare(PHP_VERSION,‘5.3.0‘,‘<‘);
系統調試設定:define(‘APP_DEBUG‘, true );
應用目錄設定:define ( ‘APP_PATH‘, ‘./Application/‘ );
緩存目錄設定:define ( ‘RUNTIME_PATH‘, ‘./Runtime/‘ );
引入ThinkPHP:require ‘./ThinkPHP/ThinkPHP.php‘;
2. ThinkPHP.php——ThinkPHP架構的入口檔案,定義各種常量、判斷系統環境,初始化應用
路徑:‘./ThinkPHP/ThinkPHP.php‘
定義常量:版本号 THINK_VERSION、URL 模式定義(4 種模式)、類檔案字尾 EXT、是否為SAE 環境、常用的系統路徑常量(如Think類庫目錄、應用公共目錄、緩存目錄、配置目錄等);
引入核心類Think.class.php:require CORE_PATH.‘Think‘.EXT;
應用初始化:Think\Think::start(); //命名空間\類名::方法(); //這裡用到了命名空間
3. Think.class.php——架構的核心類,初始化應用程式,加載配置、類庫,錯誤和異常處理,執行個體化對象
路徑:‘./ThinkPHP/Library/Think/Think.class.php‘ 聲明:Think\Think
start()方法:加載需用的類、配置、語言包,是否需要緩存,運作應用
①設定方法: spl_autoload_register(‘Think\Think::autoload‘); 自動加載類的方法,以及一些錯誤異常處理方法;
②分布式存儲類初始化,用于讀取、寫入、删除檔案;Storage::connect(STORAGE_TYPE);
③開發模式不緩存加載的核心類檔案$runtimefile,使用者模式将所有需引用的類并到同一個檔案中緩存,加快後續通路速度。
④加載應用的配置檔案、需要的函數和類檔案、行文擴充等檔案路徑的數組$mode;include ‘./ThinkPHP/Mode/common.php‘
⑤循環加載處理$mode 數組中的各路徑的檔案;
⑥檢查應用目錄結構是否存在,不存在則會預設生成目錄結構;(這個針對ThinkPHP建立一個應用,首次通路時使用)
⑦開始運作應用 App::run(); 即:‘./ThinkPHP/Library/Think/App.class.php‘
4. App.class.php——加載公共檔案配置、URL解析、調用對應的控制器方法
路徑:‘./ThinkPHP/Library/Think/App.class.php‘ 聲明:Think\App
run()方法:
①App::init();
load_ext_file 加載應用的公共檔案(./Application/Common/Common/)配置
(./Application/Common/Conf)
Think\Dispatcher::dispatch(); URL解析,擷取控制器 index、方法 index
②App::exec(); 執行應用程式,及建立控制器HomeConstroller 的執行個體,即對象; 建立控制器執行個體:$module = controller(CONTROLLER_NAME,CONTROLLER_PATH);
即=new IndexController();
利用 php 反 射 機 制 獲 取 action 方 法 對 象 , $method = new
\ReflectionMethod($module, $action);
執行這個方法:$method->invoke($module); //無參數時執行,通路首頁預設執行這個
$method->invokeArgs($module,$args); //有參數時執行;
以上即執行了控制器 ./Application/Home/Controller/IndexController.class.php 中的index方法
5. IndexController.class.php——應用Home中預設首頁 index的控制器
路徑:./Application/Home/Controller/IndexController.class.php
index()方法:
$category = D(‘Category‘)->getTree(); // 調用 Category 子產品
(./Application/Home/Model/CategoryModel.class.php)中的 getTree()方法,擷取到站點欄目的資料;其中Category對應的是資料表名;
$lists = D(‘Document‘)->lists(null); //和上面一樣 調用 DocumentModel.class.php中的lists()方法;
$this->assign(‘category‘,$category);// 将欄目數組資料配置設定給 category 标簽
$this->display(); // 解 析 模 版 , 輸 出 ; 模 版
(./Application/Home/View/default/Index/index.html)
到此,通路該站點首頁的流程就結束,其中背景 admin.php和安裝install.php的執行流程與之類似,這裡就不做叙述了。其中用到一些直接調用的單個大寫字母方法,都在這個公共函數檔案中(./ThinkPHP/Common/functions.php)。