Installation de ThinkPHP
Je n'entrerai pas dans les détails sur la façon de l'installer. Le document officiel - Installation. ThinkPHP explique beaucoup de choses. Dans l'ensemble, vous pouvez télécharger le package zip via Composer, Git ou accéder directement au site officiel de ThinkPHP. La version que j'ai installée est la 5.0.24
Test<.>
Après le téléchargement et l'installation, si le répertoire de téléchargement du projet est le répertoire racine du projet de votre serveur local, vous pouvez directement saisir l'adresse http://localhost/thinkphp5/public/ dans le navigateur pour accéder à la page d'accueil par défaut de ThinkPHP5, comme le montre la figure ci-dessous. Indique que ThinkPHP5 a été installé avec succès En plus de la méthode d'opération d'adresse ci-dessus, nous pouvons également configurer un hôte virtuel via Apache ou Nginx pour accéder au projet. Ceux qui sont intéressés peuvent le consulter en ligne Tutoriel spécifique, puis configurer l'hôte virtuel pour y accéder. Entrons dans le vif du sujet, analysons le processus d'exécution de ThinkPHP5 étape par étape...Fichier d'entrée (publicindex.php)
Ouvrez le fichier publicindex.php Enfin, nous pouvons voir que le code original du fichier d'entrée est le suivant// [ 应用入口文件 ] // 定义应用目录 define('APP_PATH', __DIR__ . '/../application/'); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php';
define('APP_PATH', __DIR__ . '/../application/');定义应用目录的常量APP_PATH require __DIR__ . '/../thinkphp/start.php';加载框架引导文件
Chargez le fichier de démarrage du framework (thinkphpstart.php)
De même, après avoir entré le thinkphpstart.php fichier, on peut savoir qu'il n'y a pas beaucoup de codenamespace think; // ThinkPHP 引导文件 // 1. 加载基础文件 require __DIR__ . '/base.php'; // 2. 执行应用 App::run()->send();
require __DIR__ . '/base.php';加载基础文件 App::run()->send();执行应用
Chargement du fichier de base (thinkphpbase.php)
Nous continuons à ouvrir le fichier thinkphpbase.php et constate que ce fichier n'est plus comme les deux premiers fichiers, avec seulement deux lignes de code...define('THINK_VERSION', '5.0.24'); 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); // 载入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"); } } } // 注册自动加载 \think\Loader::register(); // 注册错误和异常处理机制 \think\Error::register(); // 加载惯例配置文件 \think\Config::set(include THINK_PATH . 'convention' . EXT);
define('', '')
.env
thinkLoader::register()
Composer
runtime
classmap.php
extend
thinkError::register()
Exécuter l'application (thinkphplibrarythinkApp.php) La méthode run
Pour plus de commodité, bien que le code de cette méthode d'exécution soit un peu long, je choisis quand même de publier l'intégralité de la méthode, ne me frappez pas/** * 执行应用程序 * @access public * @param Request $request 请求对象 * @return Response * @throws Exception */ public static function run(Request $request = null) { $request = is_null($request) ? Request::instance() : $request; try { $config = self::initCommon(); // 模块/控制器绑定 if (defined('BIND_MODULE')) { BIND_MODULE && Route::bind(BIND_MODULE); } elseif ($config['auto_bind_module']) { // 入口自动绑定 $name = pathinfo($request->baseFile(), PATHINFO_FILENAME); if ($name && 'index' != $name && is_dir(APP_PATH . $name)) { Route::bind($name); } } $request->filter($config['default_filter']); // 默认语言 Lang::range($config['default_lang']); // 开启多语言机制 检测当前语言 $config['lang_switch_on'] && Lang::detect(); $request->langset(Lang::range()); // 加载系统语言包 Lang::load([ THINK_PATH . 'lang' . DS . $request->langset() . EXT, APP_PATH . 'lang' . DS . $request->langset() . EXT, ]); // 监听 app_dispatch Hook::listen('app_dispatch', self::$dispatch); // 获取应用调度信息 $dispatch = self::$dispatch; // 未设置调度信息则进行 URL 路由检测 if (empty($dispatch)) { $dispatch = self::routeCheck($request, $config); } // 记录当前调度信息 $request->dispatch($dispatch); // 记录路由和请求信息 if (self::$debug) { Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info'); Log::record('[ HEADER ] ' . var_export($request->header(), true), 'info'); Log::record('[ PARAM ] ' . var_export($request->param(), true), 'info'); } // 监听 app_begin Hook::listen('app_begin', $dispatch); // 请求缓存检查 $request->cache( $config['request_cache'], $config['request_cache_expire'], $config['request_cache_except'] ); $data = self::exec($dispatch, $config); } catch (HttpResponseException $exception) { $data = $exception->getResponse(); } // 清空类的实例化 Loader::clearInstance(); // 输出数据到客户端 if ($data instanceof Response) { $response = $data; } elseif (!is_null($data)) { // 默认自动识别响应输出类型 $type = $request->isAjax() ? Config::get('default_ajax_return') : Config::get('default_return_type'); $response = Response::create($data, $type); } else { $response = Response::create(); } // 监听 app_end Hook::listen('app_end', $response); return $response; }
$request
pour vous assurer qu'elle est valide et non nulleself::initCommon()
Appelez la méthode initCommon() dans le contrôleur actuel, qui est responsable pour initialiser l'application. Et renvoyer les informations de configurationLoader::addNamespace(self::$namespace, APP_PATH);
Enregistrer l'espace de nomsself::init()
Appelez la méthode init() de cette classe pour initialiser l'applicationextra_file_list
date_default_timezone_set($config['default_timezone']);
Définir le fuseau horaire du systèmeHook::listen('app_init');
Le comportement de surveillance du balise app_initself::routeCheck($request, $config)
Charger la méthode routeCheck du contrôleur actuel () pour la détection de routage self::exec($dispatch, $config)
Appelez la méthode exec() dans le contrôleur pour effectuer la distribution des appelsself::module()
Exécuter le module, effectuer le déploiement et l'initialisation du module, obtenir et définir le nom actuel du contrôleur et le nom de l'opérationTutoriels recommandés : " PHP" "Tutoriel ThinkPHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!