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

首頁 > 編程 > PHP > 正文

[李景山php]thinkphp核心源碼注釋-Think.class.php

2020-03-22 18:32:19
字體:
來源:轉載
供稿:網友
  • <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2006-2014 http://thinkVeVb.com All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------namespace Think;/** * ThinkPHP 引導類 * 開始了 最后的攻堅了 */html' target='_blank'>class Think {    // 類映射    private static $_map      = array(); // 倉庫 類型    // 實例化對象    private static $_instance = array(); // 實例化 的位置    /**     * 應用程序初始化     * @access public     * @return void     */    static public function start() { // 開始 初始了        // 第一步:先注冊 各種方式。      // 注冊AUTOLOAD方法      spl_autoload_register('Think/Think::autoload');    // 注冊 自動執行函數      // 設定錯誤和異常處理        // 異常關閉      register_shutdown_function('Think/Think::fatalError'); //.也就是說當我們的腳本執行完成或意外死掉導致PHP執行即將關閉時,我們的這個函數將會 被調用.      // 錯誤        set_error_handler('Think/Think::appError'); // 設置 錯誤處理 方式      // 異常        set_exception_handler('Think/Think::appException');// 設置 異常處理 方式      // 初始化文件存儲方式  第二步:文件存儲      Storage::connect(STORAGE_TYPE); // 初始化文件 存儲        // 第三步:緩存文件開始      $runtimefile  = RUNTIME_PATH.APP_MODE.'~runtime.php'; // 初始化 生成文件 開始      if(!APP_DEBUG && Storage::has($runtimefile)){ //非調試模式          Storage::load($runtimefile); // 加載文件      }else{          // 調試模式          if(Storage::has($runtimefile))              Storage::unlink($runtimefile);// 先刪掉          $content =  '';// 內容 準備 出來了          // 讀取應用模式          $mode   =   include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';// 讀取 配置 文件          // 加載核心文件          foreach ($mode['core'] as $file){              if(is_file($file)) {                include $file;                if(!APP_DEBUG) $content   .= compile($file);              }          }// 文件加載          // 加載應用模式配置文件          foreach ($mode['config'] as $key=>$file){              is_numeric($key)?C(load_config($file)):C($key,load_config($file));          }          // 讀取當前應用模式對應的配置文件          if('common' != APP_MODE && is_file(CONF_PATH.'config_'.APP_MODE.CONF_EXT))              C(load_config(CONF_PATH.'config_'.APP_MODE.CONF_EXT));            // 加載模式別名定義          if(isset($mode['alias'])){              self::addMap(is_array($mode['alias'])?$mode['alias']:include $mode['alias']);          }          // 加載應用別名定義文件          if(is_file(CONF_PATH.'alias.php'))              self::addMap(include CONF_PATH.'alias.php');          // 加載模式行為定義          if(isset($mode['tags'])) {              Hook::import(is_array($mode['tags'])?$mode['tags']:include $mode['tags']);          }          // 加載應用行為定義          if(is_file(CONF_PATH.'tags.php'))              // 允許應用增加開發模式配置定義              Hook::import(include CONF_PATH.'tags.php');             // 加載框架底層語言包          L(include THINK_PATH.'Lang/'.strtolower(C('DEFAULT_LANG')).'.php');          if(!APP_DEBUG){              $content  .=  "/nnamespace { Think//Think::addMap(".var_export(self::$_map,true).");";              $content  .=  "/nL(".var_export(L(),true).");/nC(".var_export(C(),true).');Think/Hook::import('.var_export(Hook::get(),true).');}';              Storage::put($runtimefile,strip_whitespace('<?php '.$content));          }else{            // 調試模式加載系統默認的配置文件            C(include THINK_PATH.'Conf/debug.php');            // 讀取應用調試配置文件            if(is_file(CONF_PATH.'debug'.CONF_EXT))                C(include CONF_PATH.'debug'.CONF_EXT);                     }      }// 加載各種 生成 文件      // 讀取當前應用狀態對應的配置文件      if(APP_STATUS && is_file(CONF_PATH.APP_STATUS.CONF_EXT))          C(include CONF_PATH.APP_STATUS.CONF_EXT);   // 讀取當前的配置,臨時配置文件      // 設置系統時區      date_default_timezone_set(C('DEFAULT_TIMEZONE'));      // 檢查應用目錄結構 如果不存在則自動創建      if(C('CHECK_APP_DIR')) {          $module     =   defined('BIND_MODULE') ? BIND_MODULE : C('DEFAULT_MODULE');          if(!is_dir(APP_PATH.$module) || !is_dir(LOG_PATH)){              // 檢測應用目錄結構              Build::checkDir($module);          }      }// 創建 需要創建的文件      // 記錄加載文件時間      G('loadTime');      // 運行應用      App::run(); // 開始運行 其它的代碼了。    }// 初始化 開始    // 注冊classmap    static public function addMap($class, $map=''){        if(is_array($class)){            self::$_map = array_merge(self::$_map, $class);        }else{            self::$_map[$class] = $map;        }            } // 這個 確實 是注冊 classmap 開始    // 獲取classmap    static public function getMap($class=''){        if(''===$class){            return self::$_map;        }elseif(isset(self::$_map[$class])){            return self::$_map[$class];        }else{            return null;        }    }// 獲取了 里面的  東西了。    /**     * 類庫自動加載     * @param string $class 對象類名     * @return void     * 類庫依賴加載     */    public static function autoload($class) {        // 檢查是否存在映射        if(isset(self::$_map[$class])) {            include self::$_map[$class]; // 這里是這樣的 包含對應的類文件的加載。        }elseif(false !== strpos($class,'//')){ // 如果 不是 那種帶有 命名空間的 里面            // echo strstr("Hello world!","world",true); 顯示 hello          $name           =   strstr($class, '//', true); //strstr(string,search,before_search)          if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){               // Library目錄下面的命名空間自動定位              $path       =   LIB_PATH; // 在這里的 開始 路徑的準備了。          }else{              // 檢測自定義命名空間 否則就以模塊為命名空間              $namespace  =   C('AUTOLOAD_NAMESPACE'); // 模塊的 命名空間了              $path       =   isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;          }// 開始檢測了          $filename       =   $path . str_replace('//', '/', $class) . EXT;            // 終于找到了對應的 文件 位置          if(is_file($filename)) {              // Win環境下面嚴格區分大小寫              if (IS_WIN && false === strpos(str_replace('/', '//', realpath($filename)), $class . EXT)){                  return ;              }              include $filename; // 包含文件          }        }elseif (!C('APP_USE_NAMESPACE')) { // 'APP_USE_NAMESPACE'     =>  true,    // 應用類庫是否使用命名空間            // 自動加載的類庫層            foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){                if(substr($class,-strlen($layer))==$layer){                    if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) {                        return ;                    }                }                        }// 自動 加載文件 緩存文件            // 根據自動加載路徑設置進行嘗試搜索            foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){                if(import($path.'.'.$class))                    // 如果加載類成功則返回                    return ;            }        }    }// 總結:就是 根據 文件名 之類的 解析了 對應的 類。    /**     * 取得對象實例 支持調用類的靜態方法     * @param string $class 對象類名     * @param string $method 類的靜態方法名     * @return object     */    static public function instance($class,$method='') { // 這種就是實例了        $identify   =   $class.$method;// 連接了        if(!isset(self::$_instance[$identify])) {            if(class_exists($class)){                $o = new $class();                if(!empty($method) && method_exists($o,$method))                    self::$_instance[$identify] = call_user_func(array(&$o, $method));                else                    self::$_instance[$identify] = $o;            }            else                self::halt(L('_CLASS_NOT_EXIST_').':'.$class);        }        return self::$_instance[$identify];    } // 總結:就是調用到實際里面的 method 里面的東西    /**     * 自定義異常處理     * @access public     * @param mixed $e 異常對象     */    static public function appException($e) {        $error = array();        $error['message']   =   $e->getMessage(); // 獲取信息        $trace              =   $e->getTrace();// 獲取錯誤信息        if('E'==$trace[0]['function']) {// 里面 開始            $error['file']  =   $trace[0]['file'];            $error['line']  =   $trace[0]['line'];        }else{// 對的            $error['file']  =   $e->getFile(); //獲取文件            $error['line']  =   $e->getLine(); // 獲取 line        }        $error['trace']     =   $e->getTraceAsString(); // 弄成字符串        Log::record($error['message'],Log::ERR);// 日志記錄        // 發送404信息        header('HTTP/1.1 404 Not Found');        header('Status:404 Not Found');        self::halt($error);// 異常開始    }    /**     * 自定義錯誤處理     * @access public     * @param int $errno 錯誤類型     * @param string $errstr 錯誤信息     * @param string $errfile 錯誤文件     * @param int $errline 錯誤行數     * @return void     */    static public function appError($errno, $errstr, $errfile, $errline) {      switch ($errno) {          case E_ERROR:          case E_PARSE:          case E_CORE_ERROR:          case E_COMPILE_ERROR:          case E_USER_ERROR:            ob_end_clean();            $errorStr = "$errstr ".$errfile." 第 $errline 行.";            if(C('LOG_RECORD')) Log::write("[$errno] ".$errorStr,Log::ERR);            self::halt($errorStr);            break;          default:            $errorStr = "[$errno] $errstr ".$errfile." 第 $errline 行.";            self::trace($errorStr,'','NOTIC');            break;      }    }// 總結: 記錄 外加 報錯    // 致命錯誤捕獲    static public function fatalError() {        Log::save();        if ($e = error_get_last()) {            switch($e['type']){              case E_ERROR:              case E_PARSE:              case E_CORE_ERROR:              case E_COMPILE_ERROR:              case E_USER_ERROR:                  ob_end_clean();                self::halt($e);                break;            }        }    }// 致命錯誤    /**     * 錯誤輸出     * @param mixed $error 錯誤     * @return void     */    static public function halt($error) {        $e = array();// 內容開始        if (APP_DEBUG || IS_CLI) {            //調試模式下輸出錯誤信息            if (!is_array($error)) { // 這里的還要分 字符串  或者是 數組                $trace          = debug_backtrace();                $e['message']   = $error;                $e['file']      = $trace[0]['file'];                $e['line']      = $trace[0]['line'];                ob_start();                debug_print_backtrace();                $e['trace']     = ob_get_clean();            } else {                $e              = $error;            }            if(IS_CLI){// 直接 就開始了                exit(iconv('UTF-8','gbk',$e['message']).PHP_EOL.'FILE: '.$e['file'].'('.$e['line'].')'.PHP_EOL.$e['trace']);            }        } else {            //否則定向到錯誤頁面            $error_page         = C('ERROR_PAGE');            if (!empty($error_page)) {                redirect($error_page);// 直接 跳轉            } else {                $message        = is_array($error) ? $error['message'] : $error;                $e['message']   = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE');            }        }        // 包含異常頁面模板        $exceptionFile =  C('TMPL_EXCEPTION_FILE',null,THINK_PATH.'Tpl/think_exception.tpl');        include $exceptionFile;// 包含模版 并且退出        exit;    } // 包含模版 并且退出    // 總結: 這里的 不能    /**     * 添加和獲取頁面Trace記錄     * @param string $value 變量     * @param string $label 標簽     * @param string $level 日志級別(或者頁面Trace的選項卡)     * @param boolean $record 是否記錄日志     * @return void|array     */    static public function trace($value='[think]',$label='',$level='DEBUG',$record=false) {        static $_trace =  array();// 這里的 又是靜態倉庫了,在一次運行中,要跑這么多東西,好累啊!        if('[think]' === $value){ // 獲取trace信息            return $_trace;// 也就是 默認的 返回了        }else{            $info   =   ($label?$label.':':'').print_r($value,true); // 這種是輸出 到字符串            $level  =   strtoupper($level);// 轉換成為了            if((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE')  || $record) {                Log::record($info,$level,$record); // 記錄日志            }else{                if(!isset($_trace[$level]) || count($_trace[$level])>C('TRACE_MAX_RECORD')) {                    $_trace[$level] =   array();                }                $_trace[$level][]   =   $info;            }        }    }// 這個是 記錄 信息的整理了}
    PHP編程

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    久久久久久网址| 国产亚洲精品久久久优势| 亚洲a成v人在线观看| 中文字幕亚洲情99在线| 亚洲全黄一级网站| 国产精品美女在线观看| 成人女保姆的销魂服务| 国产精品久久久久久久av电影| 欧美激情一区二区三级高清视频| 亚洲精品久久久久久久久久久久| 精品视频www| 欧美成aaa人片免费看| 成人精品一区二区三区电影免费| 这里精品视频免费| 在线观看日韩欧美| 不卡av电影院| 91精品中文在线| 欧美日韩精品在线| 国产精品视频男人的天堂| 欧美日韩一区二区精品| 中文字幕亚洲综合| 日韩av男人的天堂| 国产精品99久久久久久www| 日韩中文字幕在线视频| 国产精品久久9| 国产欧美精品一区二区三区介绍| 亚洲精品久久久久久久久久久| 日本a级片电影一区二区| 久久久www成人免费精品张筱雨| 中文字幕国内精品| 亚洲欧洲在线播放| 色午夜这里只有精品| 不用播放器成人网| 久久久噜久噜久久综合| 国产成人一区二区三区电影| 国产精品色视频| 久久影视免费观看| 国产成人jvid在线播放| 欧美精品www| 欧美贵妇videos办公室| 久久久久久成人精品| 亚洲电影免费观看高清完整版在线观看| 亚洲第一av网| 久久久久久久影视| 亚洲另类欧美自拍| 美女福利精品视频| 亚洲图片在线综合| 中文字幕欧美精品日韩中文字幕| 国产欧美久久久久久| 97精品国产97久久久久久春色| 日韩欧美在线看| 亚洲性线免费观看视频成熟| 日韩国产在线看| 伊人男人综合视频网| 国产午夜精品免费一区二区三区| 国产精品海角社区在线观看| 91九色精品视频| 日韩av在线最新| 98精品国产高清在线xxxx天堂| 日本精品va在线观看| 亚洲自拍偷拍色片视频| 91精品久久久久久久久久入口| 成人高清视频观看www| 日韩有码视频在线| 日韩激情av在线免费观看| 26uuu日韩精品一区二区| 日本不卡高字幕在线2019| 亚洲国产精品一区二区三区| 国产成人jvid在线播放| 欧美激情成人在线视频| 久久综合伊人77777蜜臀| 91成人在线播放| 国产精品第二页| 这里只有精品久久| 欧美精品福利视频| 国产亚洲成av人片在线观看桃| 日韩在线一区二区三区免费视频| 77777亚洲午夜久久多人| 91精品国产综合久久香蕉922| 欧美老女人xx| 性欧美办公室18xxxxhd| 亚洲第一视频网| 国产成人精彩在线视频九色| 亚洲黄色成人网| 欧美日韩一区二区精品| 欧美日韩一区二区精品| 97在线视频一区| 亚洲综合在线做性| 91免费综合在线| 亚洲第一黄色网| 一区二区国产精品视频| 久久久免费av| 欧美激情伊人电影| 亚洲成年人影院在线| 亚洲成**性毛茸茸| 91久久中文字幕| 国产成人在线一区| 久久人91精品久久久久久不卡| 欧美大片在线免费观看| 性欧美xxxx交| 国语自产精品视频在线看一大j8| 中文字幕日韩在线观看| 亚洲精品国产精品国产自| 欧美日韩精品中文字幕| 成人av色在线观看| 欧美第一黄色网| 成人精品视频99在线观看免费| 欧美有码在线观看视频| 久久久人成影片一区二区三区| 欧美猛少妇色xxxxx| 欧美性高跟鞋xxxxhd| 国产精品视频免费在线观看| 国产精品狼人色视频一区| 亚洲的天堂在线中文字幕| 久久久久久久久久久免费精品| 日韩av综合网站| 正在播放亚洲1区| 国内伊人久久久久久网站视频| 国产成人综合av| 久久久久国色av免费观看性色| 亚洲精品久久久久久久久久久久久| 97色在线播放视频| 国产日韩欧美视频| 亚洲第一视频网| 亚洲石原莉奈一区二区在线观看| 国产成人精品视| 国产成人综合一区二区三区| 成人a在线视频| 亚洲影影院av| 国产精品第8页| 久久精品电影网| 国产成人av网| 97精品一区二区视频在线观看| 欧美亚洲激情在线| 欧美一级淫片aaaaaaa视频| 欧美高清视频在线| 久久国产精品影视| www.欧美三级电影.com| 亚洲在线观看视频| 欧美精品videossex88| 欧美成人精品一区| 性欧美xxxx| 欧美日韩国产在线看| 国产精品久久久久av免费| 久久免费少妇高潮久久精品99| 欧美国产日韩一区二区三区| 欧美黑人又粗大| 成人精品网站在线观看| 狠狠色狠狠色综合日日五| 欧美成人午夜免费视在线看片| 国内精品在线一区| 国产免费一区视频观看免费| 日韩欧美高清在线视频| 日韩欧美综合在线视频| 日本免费一区二区三区视频观看| 日韩电影大片中文字幕| 日韩在线视频观看正片免费网站| 国产精品视频成人| 日本精品va在线观看| 欧美日韩成人黄色| 国产精品日本精品| 久久久91精品国产一区不卡| 亚洲美女精品久久| 国产精品扒开腿做爽爽爽视频|