• thinkphp 3+ 观后详解 (2)


    接上一章的内容,我们继续来看Think.class.php文件的start方法

        static public function start() {
          // 注册AUTOLOAD方法
          spl_autoload_register('ThinkThink::autoload');      
          // 设定错误和异常处理
          register_shutdown_function('ThinkThink::fatalError');
          set_error_handler('ThinkThink::appError');
          set_exception_handler('ThinkThink::appException');
    
          // 初始化文件存储方式
          Storage::connect(STORAGE_TYPE);
    

    spl_autoloader,很常见的自动加载类的函数,现在任何框架都会实现这个方式。

     register_shutdown_function('ThinkThink::fatalError');  对致命错误进行的报错进行重写
     set_error_handler('ThinkThink::appError');             对error级别错误报错进行重写
     set_exception_handler('ThinkThink::appException');     对异常报错进行的重写

    // 初始化文件存储方式
    Storage::connect(STORAGE_TYPE);
        static public function connect($type='File',$options=array()) {
            $class  =   'Think\Storage\Driver\'.ucwords($type);
            self::$handler = new $class($options);
        }
    

     这里是初始化文件存储方式的代码,首先用Storge::connect来加载文件,然后又通过$class变量来选择对应的文件系统。这种设计模式我目前还没想到是什么,感觉是工厂模式,不过又像是其他的,自己基础不牢,回去后再看下吧。

          $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);
                  }
              }
    
    

    这里是看是否有运行缓存文件,如果有并且是DEBUG模式,直接加载缓存文件,否则将删除缓存文件。

    读取应用模式,这里先找dirname($_SERVER['SCRIPT_FILENAME']).'/') . Common/Conf/core.php 中寻找,如果没有则加载Mode/sae.php

    <?php
    // +----------------------------------------------------------------------
    // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
    // +----------------------------------------------------------------------
    // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
    // +----------------------------------------------------------------------
    // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
    // +----------------------------------------------------------------------
    // | Author: luofei614 <weibo.com/luofei614>
    // +----------------------------------------------------------------------
          
    /**
     * ThinkPHP SAE应用模式定义文件
     */
    return array(
        // 配置文件
        'config'    =>  array(
            THINK_PATH.'Conf/convention.php',   // 系统惯例配置
            CONF_PATH.'config'.CONF_EXT,      // 应用公共配置
            MODE_PATH.'Sae/convention.php',//[sae] sae的惯例配置
        ),
    
        // 别名定义
        'alias'     =>  array(
            'ThinkLog'               => CORE_PATH . 'Log'.EXT,
            'ThinkLogDriverFile'   => CORE_PATH . 'Log/Driver/File'.EXT,
            'ThinkException'         => CORE_PATH . 'Exception'.EXT,
            'ThinkModel'             => CORE_PATH . 'Model'.EXT,
            'ThinkDb'                => CORE_PATH . 'Db'.EXT,
            'ThinkTemplate'          => CORE_PATH . 'Template'.EXT,
            'ThinkCache'             => CORE_PATH . 'Cache'.EXT,
            'ThinkCacheDriverFile' => CORE_PATH . 'Cache/Driver/File'.EXT,
            'ThinkStorage'           => CORE_PATH . 'Storage'.EXT,
        ),
    
        // 函数和类文件
        'core'      =>  array(
            THINK_PATH.'Common/functions.php',
            COMMON_PATH.'Common/function.php',
            CORE_PATH . 'Hook'.EXT,
            CORE_PATH . 'App'.EXT,
            CORE_PATH . 'Dispatcher'.EXT,
            //CORE_PATH . 'Log'.EXT,
            CORE_PATH . 'Route'.EXT,
            CORE_PATH . 'Controller'.EXT,
            CORE_PATH . 'View'.EXT,
            BEHAVIOR_PATH . 'ParseTemplateBehavior'.EXT,
            BEHAVIOR_PATH . 'ContentReplaceBehavior'.EXT,
        ),
        // 行为扩展定义
        'tags'  =>  array(
            'app_begin'     =>  array(
                'BehaviorReadHtmlCacheBehavior', // 读取静态缓存
            ),
            'app_end'       =>  array(
                'BehaviorShowPageTraceBehavior', // 页面Trace显示
            ),
            'view_parse'    =>  array(
                'BehaviorParseTemplateBehavior', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
            ),
            'template_filter'=> array(
                'BehaviorContentReplaceBehavior', // 模板输出替换
            ),
            'view_filter'   =>  array(
                'BehaviorWriteHtmlCacheBehavior', // 写入静态缓存
            ),
        ),
    );

    这里就是sae.php的内容,配置文件,函数和类文件行文扩展定义都放到了一个数组里。这里我并不明白框架这么做有什么好处。看到这里,框架所需要的文件基本都已经包括进来了。

              foreach ($mode['core'] as $file){
                  if(is_file($file)) {
                    include $file;
                    if(!APP_DEBUG) $content   .= compile($file);
                  }
              }
    

    到这里有点明白了,放数组里,循环加载所需的核心文件。以后再需要其他新文件,在数组里加配置就可以了。这里的compile主要是为了清除文件中可能会有的一些可能导致语法错误的code.

              foreach ($mode['config'] as $key=>$file){
                  is_numeric($key)?C(load_config($file)):C($key,load_config($file));
              }
    

     加载配置模式的配置文件

    function load_config($file,$parse=CONF_PARSE){
        $ext  = pathinfo($file,PATHINFO_EXTENSION);
        switch($ext){
            case 'php':
                return include $file;
            case 'ini':
                return parse_ini_file($file);
            case 'yaml':
                return yaml_parse_file($file);
            case 'xml': 
                return (array)simplexml_load_file($file);
            case 'json':
                return json_decode(file_get_contents($file), true);
            default:
                if(function_exists($parse)){
                    return $parse($file);
                }else{
                    E(L('_NOT_SUPPORT_').':'.$ext);
                }
        }
    }
    

    根据不同的文件选取不同的方法加载,如果是无法识别的文件,则需要在配置文件中设置,否则会选择配置的语言报错。




  • 相关阅读:
    【模板】Splay Tree
    【题解】CF718C Sasha and Array
    【题解】SP2916 GSS5
    【题解】[ZJOI2013] K大数查询
    【游记】GDOI 2021游记+赛后总结
    【游记】CSP2020 J/S游记
    【知识点】Manacher算法详解
    Vue 父组件传值给子组件,子组件拿到值,在倒计时完成后再调用父组件进行接口跳转
    V-model 结合select类型
    双向绑定和radio结合使用
  • 原文地址:https://www.cnblogs.com/best-jobs/p/4807090.html
Copyright © 2020-2023  润新知