自學TP5源碼(一)

感受在中國 ThinkPHP 在 PHP 框架中仍是佔有主導地位的。因此想透徹的理解一下這個據說簡單易學的框架。php

1.入口文件

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

定義常量 APP_PATH,而後引入了 根目錄/thinkphp/start.php 這個文件,下面再看看這個文件。thinkphp

2. 引導文件

namespace think;

// ThinkPHP 引導文件
// 1. 加載基礎文件
require __DIR__ . '/base.php';

// 2. 執行應用
App::run()->send();
複製代碼

引入了基礎文件,和執行了應用。 繼續看基礎文件 base.php數組

3. 基礎文件

define('THINK_VERSION', '5.0.20');
define('THINK_START_TIME', microtime(true));
define('THINK_START_MEM', memory_get_usage());
define('EXT', '.php');
define('DS', DIRECTORY_SEPARATOR);
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
define('LIB_PATH', THINK_PATH . 'library' . DS);
define('CORE_PATH', LIB_PATH . 'think' . DS);
define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
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_PATH', ROOT_PATH . 'vendor' . DS);
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('CACHE_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);
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);
複製代碼

定義了不少經常使用的常量和配置,使用 or 是擔憂你自行 defined 了,就能夠優先某些用戶本身定義的。DS 也是上面定義過的 至關於/app


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

// 加載環境變量配置文件
if (is_file(ROOT_PATH . '.env')) {
    $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");
        }
    }
}
複製代碼

加載的 Loader.php 後面再說。 若是根目錄有 .env文件,那麼注意函數parse_ini_file會將其那種php.ini格式的數據,變爲數組,而後存到env裏。就能夠隨時隨地用env函數來獲取本身的配置。框架


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

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

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

複製代碼

整個基礎文件 base.php 就這麼多內容了。主要就是自動加載這一塊了,關注靜態方法 \think\Loader::register() 方法函數

至於爲何方法最前面的要加 \ , 是由於是require進來的,沒有用到自動加載,屬於基類的調用前面都須要加這個。ui

相關文章
相關標籤/搜索