你的位置:首页 > ASP.net教程

[ASP.net教程]ThinkPHP3.2 加载过程(二)


回顾:

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

// 引入ThinkPHP入口文件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的几个模式  资料

普通模式下 

 1 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模式

 1 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  文件中可以进行设置

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

 

REWRITE模式

 1 const URL_REWRITE = 2; //REWRITE模式 

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


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

 

兼容模式

 1 const URL_COMPAT = 3; // 兼容模式

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

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

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

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

 

修改模式方法

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

   1 'URL_MODEL' => 1, // URL访问模式,可选参数0、1、2、3,代表以下四种模式: 2 // 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大门

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