亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

thinkphp核心源碼注釋|Think.class.php

2024-05-05 00:04:36
字體:
來源:轉載
供稿:網友
thinkphp核心源碼注釋|Think.class.php
  1. <?php 
  2. // +---------------------------------------------------------------------- 
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ] 
  4. // +---------------------------------------------------------------------- 
  5. // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. 
  6. // +---------------------------------------------------------------------- 
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) 
  8. // +---------------------------------------------------------------------- 
  9. // | Author: liu21st <liu21st@gmail.com> 
  10. // +---------------------------------------------------------------------- 
  11.  
  12. namespace Think; 
  13. /** 
  14.  * ThinkPHP 引導類 
  15.  * 開始了 最后的攻堅了 
  16.  */ 
  17. class Think { 
  18.  
  19.     // 類映射 
  20.     private static $_map      = array(); // 倉庫 類型 
  21.  
  22.     // 實例化對象 
  23.     private static $_instance = array(); // 實例化 的位置 
  24.  
  25.     /** 
  26.      * 應用程序初始化 
  27.      * @access public 
  28.      * @return void 
  29.      */ 
  30.     static public function start() { // 開始 初始了 
  31.         // 第一步:先注冊 各種方式。 
  32.       // 注冊AUTOLOAD方法 
  33.       spl_autoload_register('Think/Think::autoload');    // 注冊 自動執行函數 
  34.       // 設定錯誤和異常處理 
  35.         // 異常關閉 
  36.       register_shutdown_function('Think/Think::fatalError'); //.也就是說當我們的腳本執行完成或意外死掉導致PHP執行即將關閉時,我們的這個函數將會 被調用. 
  37.       // 錯誤 
  38.         set_error_handler('Think/Think::appError'); // 設置 錯誤處理 方式 
  39.       // 異常 
  40.         set_exception_handler('Think/Think::appException');// 設置 異常處理 方式 
  41.  
  42.       // 初始化文件存儲方式  第二步:文件存儲 
  43.       Storage::connect(STORAGE_TYPE); // 初始化文件 存儲 
  44.  
  45.         // 第三步:緩存文件開始 
  46.       $runtimefile  = RUNTIME_PATH.APP_MODE.'~runtime.php'// 初始化 生成文件 開始 
  47.       if(!APP_DEBUG && Storage::has($runtimefile)){ //非調試模式 
  48.           Storage::load($runtimefile); // 加載文件 
  49.       }else
  50.           // 調試模式 
  51.           if(Storage::has($runtimefile)) 
  52.               Storage::unlink($runtimefile);// 先刪掉 
  53.           $content =  '';// 內容 準備 出來了 
  54.           // 讀取應用模式 
  55.           $mode   =   include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';// 讀取 配置 文件 
  56.           // 加載核心文件 
  57.           foreach ($mode['core'as $file){ 
  58.               if(is_file($file)) { 
  59.                 include $file
  60.                 if(!APP_DEBUG) $content   .= compile($file); 
  61.               } 
  62.           }// 文件加載 
  63.  
  64.           // 加載應用模式配置文件 
  65.           foreach ($mode['config'as $key=>$file){ 
  66.               is_numeric($key)?C(load_config($file)):C($key,load_config($file)); 
  67.           } 
  68.  
  69.           // 讀取當前應用模式對應的配置文件 
  70.           if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.CONF_EXT)) 
  71.               C(load_config(CONF_PATH.'config_'.APP_MODE.CONF_EXT));   
  72.  
  73.           // 加載模式別名定義 
  74.           if(isset($mode['alias'])){ 
  75.               self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']); 
  76.           } 
  77.  
  78.           // 加載應用別名定義文件 
  79.           if(is_file(CONF_PATH.'alias.php')) 
  80.               self::addMap(include CONF_PATH.'alias.php'); 
  81.  
  82.           // 加載模式行為定義 
  83.           if(isset($mode['tags'])) { 
  84.               Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']); 
  85.           } 
  86.  
  87.           // 加載應用行為定義 
  88.           if(is_file(CONF_PATH.'tags.php')) 
  89.               // 允許應用增加開發模式配置定義 
  90.               Hook::import(include CONF_PATH.'tags.php');    
  91.  
  92.           // 加載框架底層語言包 
  93.           L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php'); 
  94.  
  95.           if(!APP_DEBUG){ 
  96.               $content  .=  "/nnamespace { Think//Think::addMap(".var_export(self::$_map,true).");"
  97.               $content  .=  "/nL(".var_export(L(),true).");/nC(".var_export(C(),true).');Think/Hook::import('.var_export(Hook::get(),true).');}'
  98.               Storage::put($runtimefile,strip_whitespace('<?php '.$content)); 
  99.           }else
  100.             // 調試模式加載系統默認的配置文件 
  101.             C(include THINK_PATH.'Conf/debug.php'); 
  102.             // 讀取應用調試配置文件 
  103.             if(is_file(CONF_PATH.'debug'.CONF_EXT)) 
  104.                 C(include CONF_PATH.'debug'.CONF_EXT);            
  105.           } 
  106.       }// 加載各種 生成 文件 
  107.  
  108.       // 讀取當前應用狀態對應的配置文件 
  109.       if(APP_STATUS && is_file(CONF_PATH.APP_STATUS.CONF_EXT)) 
  110.           C(include CONF_PATH.APP_STATUS.CONF_EXT);   // 讀取當前的配置,臨時配置文件 
  111.  
  112.       // 設置系統時區 
  113.       date_default_timezone_set(C('DEFAULT_TIMEZONE')); 
  114.  
  115.       // 檢查應用目錄結構 如果不存在則自動創建 
  116.       if(C('CHECK_APP_DIR')) { 
  117.           $module     =   defined('BIND_MODULE') ? BIND_MODULE : C('DEFAULT_MODULE'); 
  118.           if(!is_dir(APP_PATH.$module) || !is_dir(LOG_PATH)){ 
  119.               // 檢測應用目錄結構 
  120.               Build::checkDir($module); 
  121.           } 
  122.       }// 創建 需要創建的文件 
  123.  
  124.       // 記錄加載文件時間 
  125.       G('loadTime'); 
  126.       // 運行應用 
  127.       App::run(); // 開始運行 其它的代碼了。 
  128.     }// 初始化 開始 
  129.  
  130.     // 注冊classmap 
  131.     static public function addMap($class$map=''){ 
  132.         if(is_array($class)){ 
  133.             self::$_map = array_merge(self::$_map$class); 
  134.         }else
  135.             self::$_map[$class] = $map
  136.         }         
  137.     } // 這個 確實 是注冊 classmap 開始 
  138.  
  139.     // 獲取classmap 
  140.     static public function getMap($class=''){ 
  141.         if(''===$class){ 
  142.             return self::$_map
  143.         }elseif(isset(self::$_map[$class])){ 
  144.             return self::$_map[$class]; 
  145.         }else
  146.             return null; 
  147.         } 
  148.     }// 獲取了 里面的  東西了。 
  149.  
  150.     /** 
  151.      * 類庫自動加載 
  152.      * @param string $class 對象類名 
  153.      * @return void 
  154.      * 類庫依賴加載 
  155.      */ 
  156.     public static function autoload($class) { 
  157.         // 檢查是否存在映射 
  158.         if(isset(self::$_map[$class])) { 
  159.             include self::$_map[$class]; // 這里是這樣的 包含對應的類文件的加載。 
  160.         }elseif(false !== strpos($class,'//')){ // 如果 不是 那種帶有 命名空間的 里面 
  161.             // echo strstr("Hello world!","world",true); 顯示 hello 
  162.           $name           =   strstr($class'//', true); //strstr(string,search,before_search) 
  163.           if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){  
  164.               // Library目錄下面的命名空間自動定位 
  165.               $path       =   LIB_PATH; // 在這里的 開始 路徑的準備了。 
  166.           }else
  167.               // 檢測自定義命名空間 否則就以模塊為命名空間 
  168.               $namespace  =   C('AUTOLOAD_NAMESPACE'); // 模塊的 命名空間了 
  169.               $path       =   isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH; 
  170.           }// 開始檢測了 
  171.           $filename       =   $path . str_replace('//', '/', $class) . EXT; 
  172.             // 終于找到了對應的 文件 位置 
  173.           if(is_file($filename)) { 
  174.               // Win環境下面嚴格區分大小寫 
  175.               if (IS_WIN && false === strpos(str_replace('/''//'realpath($filename)), $class . EXT)){ 
  176.                   return ; 
  177.               } 
  178.               include $filename// 包含文件 
  179.           } 
  180.         }elseif (!C('APP_USE_NAMESPACE')) { // 'APP_USE_NAMESPACE'     =>  true,    // 應用類庫是否使用命名空間 
  181.             // 自動加載的類庫層 
  182.             foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){ 
  183.                 if(substr($class,-strlen($layer))==$layer){ 
  184.                     if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) { 
  185.                         return ; 
  186.                     } 
  187.                 }             
  188.             }// 自動 加載文件 緩存文件 
  189.             // 根據自動加載路徑設置進行嘗試搜索 
  190.             foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){ 
  191.                 if(import($path.'.'.$class)) 
  192.                     // 如果加載類成功則返回 
  193.                     return ; 
  194.             } 
  195.         } 
  196.     }// 總結:就是 根據 文件名 之類的 解析了 對應的 類。 
  197.  
  198.     /** 
  199.      * 取得對象實例 支持調用類的靜態方法 
  200.      * @param string $class 對象類名 
  201.      * @param string $method 類的靜態方法名 
  202.      * @return object 
  203.      */ 
  204.     static public function instance($class,$method='') { // 這種就是實例了 
  205.         $identify   =   $class.$method;// 連接了 
  206.         if(!isset(self::$_instance[$identify])) { 
  207.             if(class_exists($class)){ 
  208.                 $o = new $class(); 
  209.                 if(!emptyempty($method) && method_exists($o,$method)) 
  210.                     self::$_instance[$identify] = call_user_func(array(&$o$method)); 
  211.                 else 
  212.                     self::$_instance[$identify] = $o
  213.             } 
  214.             else 
  215.                 self::halt(L('_CLASS_NOT_EXIST_').':'.$class); 
  216.         } 
  217.         return self::$_instance[$identify]; 
  218.     } // 總結:就是調用到實際里面的 method 里面的東西 
  219.  
  220.     /** 
  221.      * 自定義異常處理 
  222.      * @access public 
  223.      * @param mixed $e 異常對象 
  224.      */ 
  225.     static public function appException($e) { 
  226.         $error = array(); 
  227.         $error['message']   =   $e->getMessage(); // 獲取信息 
  228.         $trace              =   $e->getTrace();// 獲取錯誤信息 
  229.         if('E'==$trace[0]['function']) {// 里面 開始 
  230.             $error['file']  =   $trace[0]['file']; 
  231.             $error['line']  =   $trace[0]['line']; 
  232.         }else{// 對的 
  233.             $error['file']  =   $e->getFile(); //獲取文件 
  234.             $error['line']  =   $e->getLine(); // 獲取 line 
  235.         } 
  236.         $error['trace']     =   $e->getTraceAsString(); // 弄成字符串 
  237.         Log::record($error['message'],Log::ERR);// 日志記錄 
  238.         // 發送404信息 
  239.         header('HTTP/1.1 404 Not Found'); 
  240.         header('Status:404 Not Found'); 
  241.         self::halt($error);// 異常開始 
  242.     } 
  243.  
  244.     /** 
  245.      * 自定義錯誤處理 
  246.      * @access public 
  247.      * @param int $errno 錯誤類型 
  248.      * @param string $errstr 錯誤信息 
  249.      * @param string $errfile 錯誤文件 
  250.      * @param int $errline 錯誤行數 
  251.      * @return void 
  252.      */ 
  253.     static public function appError($errno$errstr$errfile$errline) { 
  254.       switch ($errno) { 
  255.           case E_ERROR: 
  256.           case E_PARSE: 
  257.           case E_CORE_ERROR: 
  258.           case E_COMPILE_ERROR: 
  259.           case E_USER_ERROR: 
  260.             ob_end_clean(); 
  261.             $errorStr = "$errstr ".$errfile." 第 $errline 行."
  262.             if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR); 
  263.             self::halt($errorStr); 
  264.             break
  265.           default
  266.             $errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行."
  267.             self::trace($errorStr,'','NOTIC'); 
  268.             break
  269.       } 
  270.     }// 總結: 記錄 外加 報錯 
  271.  
  272.     // 致命錯誤捕獲 
  273.     static public function fatalError() { 
  274.         Log::save(); 
  275.         if ($e = error_get_last()) { 
  276.             switch($e['type']){ 
  277.               case E_ERROR: 
  278.               case E_PARSE: 
  279.               case E_CORE_ERROR: 
  280.               case E_COMPILE_ERROR: 
  281.               case E_USER_ERROR:   
  282.                 ob_end_clean(); 
  283.                 self::halt($e); 
  284.                 break
  285.             } 
  286.         } 
  287.     }// 致命錯誤 
  288.  
  289.     /** 
  290.      * 錯誤輸出 
  291.      * @param mixed $error 錯誤 
  292.      * @return void 
  293.      */ 
  294.     static public function halt($error) { 
  295.         $e = array();// 內容開始 
  296.         if (APP_DEBUG || IS_CLI) { 
  297.             //調試模式下輸出錯誤信息 
  298.             if (!is_array($error)) { // 這里的還要分 字符串  或者是 數組 
  299.                 $trace          = debug_backtrace(); 
  300.                 $e['message']   = $error
  301.                 $e['file']      = $trace[0]['file']; 
  302.                 $e['line']      = $trace[0]['line']; 
  303.                 ob_start(); 
  304.                 debug_print_backtrace(); 
  305.                 $e['trace']     = ob_get_clean(); 
  306.             } else { 
  307.                 $e              = $error
  308.             } 
  309.             if(IS_CLI){// 直接 就開始了 
  310.                 exit(iconv('UTF-8','gbk',$e['message']).PHP_EOL.'FILE: '.$e['file'].'('.$e['line'].')'.PHP_EOL.$e['trace']); 
  311.             } 
  312.         } else { 
  313.             //否則定向到錯誤頁面 
  314.             $error_page         = C('ERROR_PAGE'); 
  315.             if (!emptyempty($error_page)) { 
  316.                 redirect($error_page);// 直接 跳轉 
  317.             } else { 
  318.                 $message        = is_array($error) ? $error['message'] : $error
  319.                 $e['message']   = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE'); 
  320.             } 
  321.         } 
  322.         // 包含異常頁面模板 
  323.         $exceptionFile =  C('TMPL_EXCEPTION_FILE',null,THINK_PATH.'Tpl/think_exception.tpl'); 
  324.         include $exceptionFile;// 包含模版 并且退出 
  325.         exit
  326.     } // 包含模版 并且退出 
  327.     // 總結: 這里的 不能 
  328.  
  329.     /** 
  330.      * 添加和獲取頁面Trace記錄 
  331.      * @param string $value 變量 
  332.      * @param string $label 標簽 
  333.      * @param string $level 日志級別(或者頁面Trace的選項卡) 
  334.      * @param boolean $record 是否記錄日志 
  335.      * @return void|array 
  336.      */ 
  337.     static public function trace($value='[think]',$label='',$level='DEBUG',$record=false) { 
  338.         static $_trace =  array();// 這里的 又是靜態倉庫了,在一次運行中,要跑這么多東西,好累啊! 
  339.         if('[think]' === $value){ // 獲取trace信息 
  340.             return $_trace;// 也就是 默認的 返回了 
  341.         }else
  342.             $info   =   ($label?$label.':':'').print_r($value,true); // 這種是輸出 到字符串 
  343.             $level  =   strtoupper($level);// 轉換成為了 
  344.  
  345.             if((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE')  || $record) { 
  346.                 Log::record($info,$level,$record); // 記錄日志 
  347.             }else
  348.                 if(!isset($_trace[$level]) || count($_trace[$level])>C('TRACE_MAX_RECORD')) { 
  349.                     $_trace[$level] =   array(); 
  350.                 } 
  351.                 $_trace[$level][]   =   $info
  352.             } 
  353.         } 
  354.     }// 這個是 記錄 信息的整理了 


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧洲中文天堂| 欧美日韩电影在线观看| 91av在线影院| 精品国产精品自拍| 色诱女教师一区二区三区| 精品成人国产在线观看男人呻吟| 日韩av影视在线| 日本欧美黄网站| 亚洲图片在线综合| 成人精品网站在线观看| 亚洲精品久久久久久久久久久| 欧美极品少妇xxxxⅹ裸体艺术| 国产视频精品在线| 亚洲人成毛片在线播放| 91av在线免费观看| 91久久国产综合久久91精品网站| 国产精品久久久久久久app| 久热99视频在线观看| 国产视频一区在线| 亚洲91精品在线观看| 欧美大胆a视频| 欧美日韩激情视频| 欧美日韩性生活视频| 一区二区三区日韩在线| 一本大道香蕉久在线播放29| 97视频免费在线观看| 欧亚精品中文字幕| 久久精品欧美视频| 国产精品中文久久久久久久| 92福利视频午夜1000合集在线观看| 韩国视频理论视频久久| 91精品国产高清久久久久久久久| 日韩av在线天堂网| 亚洲а∨天堂久久精品9966| 日本国产一区二区三区| 亚洲a中文字幕| 国产日韩中文字幕| 国产中文字幕日韩| 欧美日韩综合视频| 国产精品老女人视频| 欧美日韩亚洲激情| 亚洲午夜激情免费视频| 欧美成人精品xxx| 欧美成人三级视频网站| 久久综合88中文色鬼| 欧美韩日一区二区| 色妞一区二区三区| 91精品久久久久久久久久另类| 欧洲亚洲免费视频| 亚洲成人精品av| 性亚洲最疯狂xxxx高清| 久久人人97超碰精品888| 欧美孕妇与黑人孕交| 亚洲免费成人av电影| 成人妇女免费播放久久久| 日韩麻豆第一页| www.精品av.com| 亚洲午夜精品视频| 亚洲另类图片色| 在线观看视频99| 国产成人免费av电影| 欧美性猛交xxxxx免费看| 欧美黑人一级爽快片淫片高清| 亚洲激情在线观看| 在线电影欧美日韩一区二区私密| 91免费精品视频| 日韩av在线免费观看一区| 九九九热精品免费视频观看网站| 国产日产亚洲精品| 国产成人小视频在线观看| 视频在线一区二区| 高清欧美性猛交| 国产一区玩具在线观看| 久久久久这里只有精品| 日韩av中文字幕在线播放| 日韩h在线观看| 国产一区二区三区精品久久久| 国产精品免费一区二区三区都可以| 国产亚洲精品久久久久久| 国产日韩欧美日韩| 欧美成人精品一区二区| 国产亚洲一级高清| 国产成人精品视频| 欧美黑人xxxⅹ高潮交| 欧美福利视频在线观看| 亚洲男人天堂久| 精品国产一区久久久| 亚洲天堂色网站| 国产成人精品久久二区二区91| 欧美极品美女视频网站在线观看免费| 最近中文字幕mv在线一区二区三区四区| 少妇久久久久久| 在线播放精品一区二区三区| 大胆欧美人体视频| www.日韩av.com| 亚洲国产另类久久精品| 国产欧美一区二区三区久久人妖| 色综合久久88色综合天天看泰| 成人在线国产精品| 色偷偷偷亚洲综合网另类| 国产精品扒开腿做爽爽爽视频| 日本不卡高字幕在线2019| 亚洲欧美国产日韩中文字幕| 国产精品视频网站| 欧美最近摘花xxxx摘花| 欧美成人性色生活仑片| 国产日韩欧美另类| 91亚洲精华国产精华| 久久久国产一区二区| 亚洲精品999| 亚洲a成v人在线观看| 国内免费精品永久在线视频| 国内成人精品一区| 热99久久精品| 精品国偷自产在线视频99| 91欧美日韩一区| 国产精品色婷婷视频| 欧美大片在线看| 91精品国产综合久久香蕉922| 欧美亚州一区二区三区| 国产91ⅴ在线精品免费观看| 欧美色视频日本高清在线观看| 欧美最猛性xxxxx免费| 欧美专区福利在线| 久久精品视频导航| 精品国产户外野外| 一区二区成人av| 亚洲色图第三页| 国产成人福利网站| 亚洲国产精品久久久久久| 91免费人成网站在线观看18| 日本欧美精品在线| 国产脚交av在线一区二区| 亚洲欧美三级伦理| 一区二区三区国产在线观看| 亚洲国产99精品国自产| 国产精品美女免费看| 高清视频欧美一级| 亚洲欧美日本另类| 欧美性xxxxhd| 在线播放日韩欧美| 91免费看视频.| 亚洲自拍偷拍福利| 激情懂色av一区av二区av| 日韩成人在线视频观看| 亚洲人成人99网站| 91免费综合在线| 国产成人在线一区二区| 粉嫩av一区二区三区免费野| 国产精品毛片a∨一区二区三区|国| 成人性教育视频在线观看| 欧美亚洲国产成人精品| 久久人人爽亚洲精品天堂| 亚洲精品成人网| 色综合视频网站| 国产欧美在线看| 欧美日韩爱爱视频| 国模极品一区二区三区| 国产一区二区美女视频| 国模gogo一区二区大胆私拍| 91久久久久久久| 欧美孕妇与黑人孕交| 国产一区av在线| 亚洲免费伊人电影在线观看av|