回顾:

  上次介绍了 ThinkPHP 的 Index.PHP入口文件。但只是TP的入口前面的入口(刷boss总是要过好几关才能让你看到 ,不然boss都没面子啊),从Index.PHP最后一行把我们引路到了TP的大门前(ThinkPHP/ThinkPHP.php)

  1. // 引入ThinkPHP入口文件
  2. require './ThinkPHP/ThinkPHP.php';

本次目标:

  查看TP的大门,同时稍微探索一下大门内部的东西

正文:

  先上代码

  1. // 记录开始运行时间
  2. $GLOBALS['_beginTime'] = microtime(TRUE);
  3. // 记录内存初始使用
  4. define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));
  5. if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();
  6.  
  7. // 版本信息
  8. const THINK_VERSION = '3.2.3';
  9.  
  10. // URL 模式定义
  11. const URL_COMMON = 0; //普通模式
  12. const URL_PATHINFO = 1; //PATHINFO模式
  13. const URL_REWRITE = 2; //REWRITE模式
  14. const URL_COMPAT = 3; // 兼容模式
  15.  
  16. // 类文件后缀
  17. const EXT = '.class.php';
  18.  
  19. // 系统常量定义
  20. defined('THINK_PATH') or define('THINK_PATH', __DIR__.'/');
  21. defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');
  22. defined('APP_STATUS') or define('APP_STATUS', ''); // 应用状态 加载对应的配置文件
  23. defined('APP_DEBUG') or define('APP_DEBUG', false); // 是否调试模式
  24.  
  25. if(function_exists('saeAutoLoader')){// 自动识别SAE环境
  26. defined('APP_MODE') or define('APP_MODE', 'sae');
  27. defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae');
  28. }else{
  29. defined('APP_MODE') or define('APP_MODE', 'common'); // 应用模式 默认为普通模式
  30. defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存储类型 默认为File
  31. }
  32.  
  33. defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH.'Runtime/'); // 系统运行时目录
  34. defined('LIB_PATH') or define('LIB_PATH', realpath(THINK_PATH.'Library').'/'); // 系统核心类库目录
  35. defined('CORE_PATH') or define('CORE_PATH', LIB_PATH.'Think/'); // Think类库目录
  36. defined('BEHAVIOR_PATH')or define('BEHAVIOR_PATH', LIB_PATH.'Behavior/'); // 行为类库目录
  37. defined('MODE_PATH') or define('MODE_PATH', THINK_PATH.'Mode/'); // 系统应用模式目录
  38. defined('VENDOR_PATH') or define('VENDOR_PATH', LIB_PATH.'Vendor/'); // 第三方类库目录
  39. defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH.'Common/'); // 应用公共目录
  40. defined('CONF_PATH') or define('CONF_PATH', COMMON_PATH.'Conf/'); // 应用配置目录
  41. defined('LANG_PATH') or define('LANG_PATH', COMMON_PATH.'Lang/'); // 应用语言目录
  42. defined('HTML_PATH') or define('HTML_PATH', APP_PATH.'Html/'); // 应用静态目录
  43. defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH.'Logs/'); // 应用日志目录
  44. defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH.'Temp/'); // 应用缓存目录
  45. defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH.'Data/'); // 应用数据目录
  46. defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH.'Cache/'); // 应用模板缓存目录
  47. defined('CONF_EXT') or define('CONF_EXT', '.php'); // 配置文件后缀
  48. defined('CONF_PARSE') or define('CONF_PARSE', ''); // 配置文件解析方法
  49. defined('ADDON_PATH') or define('ADDON_PATH', APP_PATH.'Addon');
  50.  
  51. // 系统信息
  52. if(version_compare(PHP_VERSION,'5.4.0','<')) {
  53. ini_set('magic_quotes_runtime',0);
  54. define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()? true : false);
  55. }else{
  56. define('MAGIC_QUOTES_GPC',false);
  57. }
  58. define('IS_CGI',(0 === strpos(PHP_SAPI,'cgi') || false !== strpos(PHP_SAPI,'fcgi')) ? 1 : 0 );
  59. define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 );
  60. define('IS_CLI',PHP_SAPI=='cli'? 1 : 0);
  61.  
  62. if(!IS_CLI) {
  63. // 当前文件名
  64. if(!defined('_PHP_FILE_')) {
  65. if(IS_CGI) {
  66. //CGI/FASTCGI模式下
  67. $_temp = explode('.php',$_SERVER['PHP_SELF']);
  68. define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/'));
  69. }else {
  70. define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'],'/'));
  71. }
  72. }
  73. if(!defined('__ROOT__')) {
  74. $_root = rtrim(dirname(_PHP_FILE_),'/');
  75. define('__ROOT__', (($_root=='/' || $_root=='\\')?'':$_root));
  76. }
  77. }
  78.  
  79. // 加载核心Think类
  80. require CORE_PATH.'Think'.EXT;
  81. // 应用初始化
  82. Think\Think::start();

解释:

  1 - 5 行:初始化  运行的时间  内存之类的东东,给开发人员提供代码运行效率直观上的体现

  8       行:不猜也能知道  就是版本好的说明嘛

  11-14行:定义4个数据嘛,也就是浏览器地址的解析模式(等一下解释)

  17   行:这里不是看到是不是感觉到  我们如果加一个php时候的文件的后缀

   20-49行:定义各种变量  但是下面的这段代码  其中有一个函数  get_magic_quotes_gpc()  这个函数做什么用  我大致查选了一下  大致说法  参考。TP里面  能起到多大的作用  我也不是很清楚   如果谁知道  欢迎给大家说明一下

    PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。

  1. if(version_compare(PHP_VERSION,'5.4.0','<')) {
  2. ini_set('magic_quotes_runtime',0);
  3. define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()? true : false);
  4. }else{
  5. define('MAGIC_QUOTES_GPC',false);
  6. }

  最后是加载核心Think类  和运行Think类中的start()这个方法

  1. // 加载核心Think类
  2. require CORE_PATH.'Think'.EXT;
  3. // 应用初始化
  4. Think\Think::start();

说明一下TP中的URL的几个模式  资料

普通模式下

const URL_COMMON = 0; //普通模式

   URL为  http://localhost/?m=home&c=user&a=login&var=value

m参数表示模块,c参数表示控制器,a参数表示操作(当然这些参数都是可以配置的),后面的表示其他GET参数。

  'VAR_MODULE' => 'm', // 默认模块获取变量

  'VAR_CONTROLLER' => 'c', // 默认控制器获取变量

    'VAR_ACTION' => 'a', // 默认操作获取变量
  值的定义在ThinkPHP\Conf\Convention.php
  

  1. /* 系统变量名称设置 */
  2. 'VAR_MODULE' => 'm', // 默认模块获取变量
  3. 'VAR_ADDON' => 'addon', // 默认的插件控制器命名空间变量
  4. 'VAR_CONTROLLER' => 'c', // 默认控制器获取变量
  5. 'VAR_ACTION' => 'a', // 默认操作获取变量
  6. 'VAR_AJAX_SUBMIT' => 'ajax', // 默认的AJAX提交变量
  7. 'VAR_JSONP_HANDLER' => 'callback',
  8. 'VAR_PATHINFO' => 's', // 兼容模式PATHINFO获取变量例如 ?s=/module/action/id/1 后面的参数取决于URL_PATHINFO_DEPR
  9. 'VAR_TEMPLATE' => 't', // 默认模板切换变量
  10. 'VAR_AUTO_STRING' => false, // 输入变量是否自动强制转换为字符串 如果开启则数组变量需要手动传入变量修饰符获取变量

PATHINFO模式

const URL_PATHINFO = 1; //PATHINFO模式 该模式是默认模式

  URL: http://localhost/index.php/home/user/login/var/value/

  PATHINFO地址的前三个参数分别表示模块/控制器/操作。

  说白了就是把普通模式下的几个M  C  A 变量给省掉  使用斜杠来代替

  好处:1.看上去很整齐   2.据说可以提高被搜索引擎抓住的几率哦!!!

  当然是斜杠还是别的是可以设置的在  ThinkPHP\Conf\Convention.php  文件中可以进行设置

    'URL_PATHINFO_DEPR' => '/', // PATHINFO模式下,各参数之间的分割符号

REWRITE模式

const URL_REWRITE = 2; //REWRITE模式

  官方的原话  : REWRITE模式是在PATHINFO模式的基础上添加了重写规则的支持,可以去掉URL地址里面的入口文件index.php,但是需要额外配置WEB服务器的重写规则。

  如何是这样,那么我觉得应该就是  浏览器地址给重写以后在按照PATHINFO模式进行解析路由

兼容模式

const URL_COMPAT = 3; // 兼容模式

  URL http://localhost/?s=/home/user/login/var/value

  看到这个地址  YII的人有木有感觉很熟悉

  为什么是S开头呢?是因为配置文件的设置   在 ThinkPHP\Conf\Convention.php

    'VAR_PATHINFO' => 's', // 兼容模式PATHINFO获取变量例如 ?s=/module/action/id/1 后面的参数取决于URL_PATHINFO_DEPR

修改模式方法

  在配置文件 ThinkPHP\Conf\Convention.php

    'URL_MODEL' => 1, // URL访问模式,可选参数0、1、2、3,代表以下四种模式: // 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE 模式); 3 (兼容模式) 默认为PATHINFO 模式

对于以上集中模式个人的小总结:  

  不管是那个  我们把URL中出了模块名称开始前都去掉,就是不同的几种取出模块、控制器、控制器其中的方法名。所以在不配置路由和不使用默认的情况下,我们都能看到这三个参数。

总结:

  ThinkPHP\ThinkPHP.php文件中  最主要的目的还是定义好各种目录的变量方便以后的调用

  如果你发现代码中有一个定义你不知道做什么,如果是_path结尾(关于目录的),就去ThinkPHP\ThinkPHP.php中找找,别的那么就去ThinkPHP\Conf\Convention.php下找找  基本都能找到

几个思考(个人在整理时候想到的):

  1.定义IS_CGI ,IS_WIN,IS_CLI,MAGIC_QUOTES_GPC干嘛用

  1. // 系统信息
  2. if(version_compare(PHP_VERSION,'5.4.0','<')) {
  3. ini_set('magic_quotes_runtime',0);
  4. define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()? true : false);
  5. }else{
  6. define('MAGIC_QUOTES_GPC',false);
  7. }
  8. define('IS_CGI',(0 === strpos(PHP_SAPI,'cgi') || false !== strpos(PHP_SAPI,'fcgi')) ? 1 : 0 );
  9. define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 );
  10. define('IS_CLI',PHP_SAPI=='cli'? 1 : 0);

  2.为什么我们刚下载的架构不需要输入模块、控制器、方法名也能正常跳出页面。

好了,下一次我们就拿上小米加步枪杀进TP大门

// 应用初始化 Think\Think::start();

ThinkPHP3.2 加载过程(二)的更多相关文章

  1. ThinkPHP3.2 加载过程(四)

    前言: 由于比较懒散,但是又是有点强迫症,所以还是想继续把ThinkPHP3.2的加载过程这个烂尾楼补充完整. ========================================分割线= ...

  2. ThinkPHP3.2 加载过程(一)

    加载过程(官方介绍) : 用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载入框架引导 ...

  3. ThinkPHP3.2 加载过程(三)

    上次回顾: IS_CGI ,IS_WIN,IS_CLI,MAGIC_QUOTES_GPC干嘛用 IS_WIN 看了一下后面的代码  基本上就是为了保证在不同环境下运行时,由于有些操作系统会对文件路径大 ...

  4. spring容器启动的加载过程(二)

    第六步: public abstract class AbstractApplicationContext extends DefaultResourceLoader implements Confi ...

  5. JAVA-大白话探索JVM-类加载过程(二)

    首先我们知道JVM是什么以及类加载器的作用 不清楚的可以看看JAVA-大白话探索JVM-类加载器(一) 现在我们来摸索下类的加载过程 首先,我们将类加载过程分为三步走 装载 链接 初始化 其中 链接 ...

  6. 工厂模式模拟Spring的bean加载过程

    一.前言    在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...

  7. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  8. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  9. (转)JVM类生命周期概述:加载时机与加载过程

    原文地址: http://blog.csdn.net/justloveyou_/article/details/72466105 JVM类加载机制主要包括两个问题:类加载的时机与步骤 和 类加载的方式 ...

随机推荐

  1. 文献阅读笔记——group sparsity and geometry constrained dictionary

    周五实验室有同学报告了ICCV2013的一篇论文group sparsity and geometry constrained dictionary learning for action recog ...

  2. 如何在有实体键的情况下全部显示ActionBar的Menu?

    大伙都知道, 在老版本手机, 以及部分的新手机上都还残留实体键, 有了这些实体键, 默认菜单是用实体菜单键呼出的, 尽管你把android:showAsAction="always" ...

  3. 熟练掌握HDFS的Shell访问

    HDFS设计的主要目的是对海量数据进行存储,也就是说在其上能够存储很大量文件 (可以存储TB级的文件).HDFS将这些文件分割之后,存储在不同的DataNode上, HDFS 提供了两种访问接口:Sh ...

  4. Eclipse对printf()不能输出到控制台的解决方法

    方案1: 在main 语句中加一条 setbuf(stdout,NULL); 这个即可. 在ecplise下使用cdt开发c程序,发现运行后终端没有输出,停止后会输出,通过在main中添加 setbu ...

  5. MySQL(19):SQL语句(MySQL)大全

    SQL语句大全一.创建和删除数据库 1.创建用户 //创建用户且置密码,在MySQL中行,但在Oracle中行  ----必须在超级管理员身份下操作 create user hncu identifi ...

  6. MSSQL系统表常用操作

    1:获取当前数据库中的所有用户表 select Name from sysobjects where xtype='u' and status>=0 2:获取某一个表的所有字段 select n ...

  7. mysql导入数据load data infile用法

    mysql导入数据load data infile用法 基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ...

  8. 未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项.试图加载格式不正确的程序

    .NET:Microsoft Visual Studio 2010 + .NET Framework 3.5 操作系统:windows2008 R2 64 位操作系统 oracle数据库:32位的OD ...

  9. Java中String类的format方法使用总结

    可参考: http://www.cnblogs.com/fsjohnhuang/p/4094777.html http://kgd1120.iteye.com/blog/1293633 String类 ...

  10. hdu 4666 最大曼哈顿距离

    思路:这题我是看了题目后,上百度搜了一下才知道还有求最大曼哈顿距离的方法.直接把代码copy过来,研读一下,知道了代码实现机制,自然就很容易想到用优先队列来维护每种状态下的xi,yi之和的最大值最小值 ...