框架只是工具,它只是將你所常常用的代碼按照必定的模式整理起來。方便程序員快速開發,也方便團隊協調工做。但框架的基礎是語言。若是連PHP有多少個超級全局變量都不知道的話,仍是須要返回去好好打打基礎。磨刀不誤砍柴工。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中的內容一目瞭然。現羅列在下面mysql
代碼以下 | 複製代碼 |
$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的靈活性,給咱們提供了不少的選擇。由於一個項目通常分爲前臺和後臺。咱們能夠經過分組,將二者部署到一個項目文件夾下,可是我以爲這樣是不明智的。
對於項目分組,我以爲應該把前臺和後臺徹底分離,置於兩個文檔樹中,框架共用,但核心代碼最好分割開來。程序員