框架只是工具,它只是将你所经常用的代码按照一定的模式整理起来。方便程序员快速开发,也方便团队协调工作。但框架的基础是语言。如果连PHP有多少个超级全局变量都不知道的话,还是需要返回去好好打打基础。磨刀不误砍柴工。
我的一个前辈说过,阅读高手写的代码是程序员迅速提升的最佳捷径。确实是这样,如果只是照着书写个简单的增改删查,也许你永远是一个低级程序员(也写程序猿,也写程序媛)。
要大胆的跳出思维限制。在自己尝试学习的时候要多改框架。积极使用echo,print_r,var_dump等。在你驾驭了框架的时候,当然可以按照自己的实际需求修改了,它再牛逼也是你完成项目的工具而已。就像骑车子,先可以买整车,当充分了解的时候,你就可以按照自己的需求组车了。
兴趣是学习最大的动力。如果喜欢,一定坚持下去。我觉得现在的社会大部分人的幸福指数是很低的,工作虽然是糊口的手段,但也是陪伴几乎你一生的东西,不要干了几十年自己的工作,回头想想没有一点乐趣。
学习ThinkPHP之前需要掌握的东西:PHP,MySql,MVC模式。
再说ThinkPHP框架缓存之前,我想说说,ThinkPHP绝对是可以和CI相媲美的优秀框架。而且是国内数一数二的PHP框架。
TP中有一个常量APP_DEBUG,位于入口文件ThinkPHP.php中。
这个常量是用来设置是否开启调试模式,我们可以在引入入口文件前进行自定义。如果将其置为FALSE,则会在runtime文件夹下生成一份~runtime.php的文件(路径和文件名均可修改)。但是文件去掉注释,空格和换行。如果直接看这份文件,太过费事。
查看源码,我们可以在runtime.php中找到一个函数:build_runtime_cache(),在写入缓存前使用了函数strip_whitespace()。我们修改源代码,将此函数去掉。然后重新编译。你会发现~runtime.php中的内容一目了然。现罗列在下面
代码如下 | 复制代码 |
$GLOBALS['_beginTime'] = microtime(TRUE); defined('APP_NAME') or define('APP_NAME','Home'); defined('APP_PATH') or define('APP_PATH','Home/'); defined('APP_DEBUG') or define('APP_DEBUG',false); defined('MEMORY_LIMIT_ON') or define('MEMORY_LIMIT_ON',true); defined('THINK_PATH') or define('THINK_PATH','D:\workplace\llbook\Source\ThinkPHP/'); defined('RUNTIME_PATH') or define('RUNTIME_PATH','Home/Runtime/'); defined('RUNTIME_FILE') or define('RUNTIME_FILE','Home/Runtime/~runtime.php'); defined('THINK_VERSION') or define('THINK_VERSION','3.1.3'); defined('MAGIC_QUOTES_GPC') or define('MAGIC_QUOTES_GPC',false); defined('IS_CGI') or define('IS_CGI',0); defined('IS_WIN') or define('IS_WIN',1); defined('IS_CLI') or define('IS_CLI',0); defined('_PHP_FILE_') or define('_PHP_FILE_','/llbook/index.php'); defined('__ROOT__') or define('__ROOT__','/llbook'); defined('URL_COMMON') or define('URL_COMMON',0); defined('URL_PATHINFO') or define('URL_PATHINFO',1); defined('URL_REWRITE') or define('URL_REWRITE',2); defined('URL_COMPAT') or define('URL_COMPAT',3); defined('CORE_PATH') or define('CORE_PATH','D:\workplace\llbook\Source\ThinkPHP/Lib/'); defined('EXTEND_PATH') or define('EXTEND_PATH','D:\workplace\llbook\Source\ThinkPHP/Extend/'); defined('MODE_PATH') or define('MODE_PATH','D:\workplace\llbook\Source\ThinkPHP/Extend/Mode/'); defined('ENGINE_PATH') or define('ENGINE_PATH','D:\workplace\llbook\Source\ThinkPHP/Extend/Engine/'); defined('VENDOR_PATH') or define('VENDOR_PATH','D:\workplace\llbook\Source\ThinkPHP/Extend/Vendor/'); defined('LIBRARY_PATH') or define('LIBRARY_PATH','D:\workplace\llbook\Source\ThinkPHP/Extend/Library/'); defined('COMMON_PATH') or define('COMMON_PATH','Home/Common/'); defined('LIB_PATH') or define('LIB_PATH','Home/Lib/'); defined('CONF_PATH') or define('CONF_PATH','Home/Conf/'); defined('LANG_PATH') or define('LANG_PATH','Home/Lang/'); defined('TMPL_PATH') or define('TMPL_PATH','Home/Tpl/'); defined('HTML_PATH') or define('HTML_PATH','Home/Html/'); defined('LOG_PATH') or define('LOG_PATH','Home/Runtime/Logs/'); defined('TEMP_PATH') or define('TEMP_PATH','Home/Runtime/Temp/'); defined('DATA_PATH') or define('DATA_PATH','Home/Runtime/Data/'); defined('CACHE_PATH') or define('CACHE_PATH','Home/Runtime/Cache/'); set_include_path(get_include_path() . PATH_SEPARATOR . VENDOR_PATH); Common.php //文件内容 Think{} ThinkException{} Behavior{} ReadHtmlCacheBehavior{} CheckRouteBehavior{} ParseTemplateBehavior{} ContentReplaceBehavior{} TokenBuildBehavior{} WriteHtmlCacheBehavior{} ShowRuntimeBehavior{} ShowPageTraceBehavior{} alias_import(array ( 'Model' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Core/Model.class.php', 'Db' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Core/Db.class.php', 'Log' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Core/Log.class.php', 'ThinkTemplate' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Template/ThinkTemplate.class.php', 'TagLib' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Template/TagLib.class.php', 'Cache' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Core/Cache.class.php', 'Widget' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Core/Widget.class.php', 'TagLibCx' => 'D:\workplace\llbook\Source\ThinkPHP/Lib/Driver/TagLib/TagLibCx.class.php', )); Functions.php Log{} Dispatcher{} App{} Action{} View{} L() //语言设置函数 G('loadTime'); Think::Start(); //启动 |
之所以费这么大的劲罗列一下是因为我也想看看到底这个框架运行的时候包含了那些需要的文件。这也就是说上面的文件我们在写项目的时候可以直接引用。TP就是按照各种规则条件将文件打乱,按照MVC模式,进行工厂化的处理。但是在使用的时候必须将文件一一引入,你可以把它们看作是ThinkPHP.php中的一份文件。还可以看出,它加载的是最基础的配置文件,函数文件,类文件。而项目文件里面的配置文件和函数文件也是通过函数引入的(这里没有配置),而天安妇科医院类文件如Action文件和Module文件是通过url路由规则动态获取的。从这份缓存文件里还可以看出,TP有很多约定的规则,如命名规则,路径规则等。我觉得在使用TP的时候我们必须明白TP是如何将不同行为的文件分割开发,又是如何利用路径规则在文件需要的时候恰当引入的。我们接下所有的项目都基于上面这份文件里的代码,学习这份代码是必要的。
那么当使用框架的时候,如何利用框架进行项目部署呢?我觉得因为TP的灵活性,给我们提供了很多的选择。因为一个项目一般分为前台和后台。我们可以通过分组,将两者部署到一个项目文件夹下,但是我觉得这样是不明智的。
对于项目分组,我觉得应该把前台和后台完全分离,置于两个文档树中,框架共用,但核心代码最好分割开来。