天天看點

通路網站首頁 index.php,跟着執行流程走一遍

通路網站首頁 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)。