thinkPHP5框架解讀

一、入口文件

//public/index.php

//定義應用目錄
define('APP_PATH',__DIR__.'/../application/');
//加載框架引導文件
require __dir__.'/../thinkphp/start.php';

調用thinkphp文件夾中的start.php

//thinkphp/start.php

namespace think;

//加載基礎文件
require __DIR__.'/base.php';
//執行應用
App::run()->send();

調用thinkphp文件夾中的base.php

//thinkphp/base.php


//thinkphp版本
define('THINK_VERSION','5.0.16');

//thinkphp開始的時間
define('THINK_START_TIME',microtime(true));

//當前分配給你的 PHP 腳本的內存量,單位是字節(byte)
define('THINK_START_MEM',memory_get_useage());

//文件後綴
define('EXT','.php');

//定義文件分隔符 DIRECTORY_SEPARATOR = "/"
define('DS',DIRECTORY_SEPARATOR);

//判斷think目錄是否定義
defined('THINK_PATH') or define('THINK_PATH',__DIR__.DS);

//定義lib文件夾路徑
define('LIB_PATH',THINK_PATH.'library'.DS);

//框架核心文件夾路徑
define('CORE_PATH',LIB_PATH.'think'.DS);

//trait目錄
define('TRAIT_PATH',LIB_PATH.'traits'.DS);

//判斷應用目錄是否定義 $_SERVER['SCRIPT_FILENAME']獲取前腳本絕對路徑 dirname()獲取腳本所在的文件夾
defined('APP_PATH') or define('APP_PATH',dirname($_SERVER['SCRIPT_FILENAME']).DS);

//判斷網站路徑是否定義 realpath 函數返回絕對路徑
defined('ROOT_PATH') or define('ROOT_PATH',dirname(realpath(APP_PATH)).DS);

//判斷定義拓展文件夾路徑
defined('EXTEND_PATH') or define('EXTEND_PATH',ROOT_PATH.'extend'.DS);

// 渲染文件夾目錄
defined('VENDOR_PATH') or define('VENDOR',ROOT_PATH.'vendor'.DS);

//runtime
defined('RUNTIME_PATH') or define('RUNTIME_PATH',ROOT_PATH.'runtime'.DS);

//日誌
defined('LOG_PATH') or define('LOG_PATH',RUNTIME_PATH.'log'.DS);

//緩存
defined('CACHE_PATH') or define('LOG_PATH',RUNTIME_PATH.'cache'.DS);

//模板
defined('TEMP_PATH') or define('TEMP_PATH',RUNTIME_PATH.'temp'.DS);

// 配置文件目錄
defined('CONF_PATH') or define('CONF_PATH',APP_PATH);

// 配置文件後綴
defined('CONF_EXT') or define('CONF_EXT',EXT);

//環境變量的配置前綴
defined('ENV_PREFIX') or define('ENV_PREFIX','PHP_');

//環境常量
define('IS_CLI',PHP_SAPI=='cli'?true:false); web服務器
define('IS_WIN',strpos(PHP_OS,'WIN') !== false); //操作系統

//載入loader類
require CORE_PATH.'loader.php';

//載入環境變量配置文件
if(is_file(ROOT_PATH.'env')){
    //parse_ini_file() 載入一個由 filename指定的 ini 文件,並將其中的設置作爲一個聯合數組返回
    $env = parse_ini_file(ROOT_PATH.'.env',true); 
    foreach($env as $key=>$val){
        $name = ENV_PREFIX.strtoupper($key);

        if(is_array($val)){
            foreach($val as $k=>$v){
                $item = $name.'_'.strtoupper($k);
                putenv("$item=$v");
            }
        }else{
            putenv("$name=$val");
        }
    }
}

//註冊自動加載
\think\Loader::register();

//註冊錯誤和異常處理機制
\think\Error::register();

//加載慣例配置文件
\think\Config::set(include THINK_PATH.'convention'.EXT);

調用think文件夾下的Loader類

//lib/think

//自動加載
public static function autoload($class)
{
    ...
}

//查找文件
private static function findFile($class)
{
    ...
}

//註冊classmap
public static function addClassMap($class, $map = '')
{
    ...
}

//註冊命名空間
public static funtion addNamespace($namespace, $path = '')
{
    ...
}

//添加 PSR-4 空間
private static function addPsr4($prefix, $paths, $prepend = false)
{
    ...
}

// 註冊命名空間別名
public static function addNamespaceAlias($namespace, $original = '')
{
    ...
}

//註冊自動加載機制
public static function register($autoload = null)
{
    ...
}

//註冊composer自動加載
private static function registerComposerLoader()
{
    ...
}

//導入所需類庫同 Java 的 import 本函數有緩存功能
public static function import($class, $baseUrl = '', $ext = EXT)
{
    ...
}

//實例化 (分層)模型
public static function model($name = '', $layer = 'model', $appendSuffix = false, $common = 'common')
{
    ...
}

//實例化(分層)控制器格式
public static function controller($name, $layer = 'controller', $appendSuffix = false, $empty = '')
{
    ...
}

//實例化驗證類格式
public static function validate($name, $layer = 'validate', $appendSuffix = false, $common = 'common')
{
    ...
}

//解析模板和類名
protected static function getModuleAndClass($name, $layer, $appendSuffix)
{
    ...
}

//數據庫初始化,並取得數據庫類實例
public static function db($config = [], $name = false)
{
    ...
}

//字符串命名風格轉換
public static function parseName($name, $type = 0, $ucfirst = true)
{
    ...
}

// 解析應用類的類名
public static function parseClass($module, $layer, $name, $appendSuffix)
{
    ...
}

//初始化類的實例
public static function clearInstance()
{
    ...
}

//作用範圍隔離
function __include_fime($file)
{
    ...
}
function __require_file($file)
{
    ...
}

調用think文件夾下的App.php

//library/think

class APP
{
    // 執行應用程序
    public static function run(Request $request = null)
    {
        ...
    }

    // 初始化應用,並返回配置信息
    public static function initCommon()
    {
        ...
    }

    //初始化應用或模塊
    private static function init($module = '')
    {
        ...
    }
    
    //設置當前請求的調度信息
    public static function dispatch($dispatch, $type = 'module')
    {
        ...
    }

    //執行函數或閉包方法 支持參數調用
    public static function invokeFunction($function, $vars = [])
    {
        ...
    }

    //調用反射執行類的方法 支持參數綁定
    public static function invokeMethod($mothed, $vars = [])
    {
        ...
    }

    //調用反射執行類的實例化 支持依賴注入
    public static function invokeClass($class, $vars = [])
    {
        ...
    }

    // 綁定參數
    private static function bindParams($reflect, $vars = [])
    {
        ...
    }
    
    // 獲取參數值
    private static function getParamvalue($param, &$vars, $type)
    {
        ...
    }

    // 執行調度分發
    protected static function exec($dispatch, $config)
    {
        ...
    }

    //執行模塊
    public static function module($result, $config, $convert = null)
    {
        ...
    }

    //URL 路由檢查
    public static function routeCheck($request, array $config)
    {
        ...
    }
    
    //設置應用的路由檢測機制
    public static function route($route, $must = false)
    {
        ...
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章