http://blog.csdn.net/sky_zhe/article/details/38906689

Flight 框架

Flight类

1、加载 autoload.php ,启动框架的自动加载机制

实际执行的是 Loader::autoload 函数, 关键代码

$class_file = str_replace(array('\\', '_'), '/', $class).'.php';

可以看到是依据PSR-0标准来做的,_ 也被转化为目录

另外同时定义了,根目录是项目根目录

2、启动 Engine.php

使用 __callStatic 函数将对调用转到 Engine 类上:

return \flight\core\Dispatcher::invokeMethod(array(self::$engine, $name), $params); 

Engine类

1、首先是个容器

    protected $vars; //变量
protected $loader; //类
protected $dispatcher; //函数或方法,(称为事件)

对变量的储存和使用,是通过 has,get,set,clear 等方法

2、对类(component)的管理,通过 Loader 类

Loader 通过 register 方法注册类及加载方法,通过 load 方法加载(实现了单例模式)

框架本身已经实现了 request,response,router和view等类

也可以使用Engine的register 方法添加自定义的类

3、对事件(函数或方法)的调用,通过 Dispatcher 类

对函数或方法命名,定义一个事件

Dispatcher 通过 set 注册事件,get获得事件,并通过 run 执行事件,

在run过程中,很重要的,就是可以hook一个事件,

    public function hook($name, $type, $callback) {
$this->filters[$name][$type][] = $callback; // type 可以是before or after
}

也就是在事件被实际调用(execute)前后,调用(filter)所有的自定义函数(在filters数组里面)

(最后执行函数的是callFunction,方法的是invokeMethod)

框架本身定义了多个事件:

start 是框架开始执行,stop 是结束,route是添加路由,还用redirect等等

render是显示页面,json,jsonp等等

这些事件的实际执行代码也在Engine类中(以_开头)

可以用map添加自定义事件,用before,after分别hook事件前后

4、类和事件的调用

如上,类和事件管理在Loader 和 Dispatcher 中,但都是通过Engine类调用的

    public function register($name, $class, array $params = array(), $callback = null) {
$this->loader->register($name, $class, $params, $callback);
} public function map($name, $callback) {
$this->dispatcher->set($name, $callback);
} public function before($name, $callback) {
$this->dispatcher->hook($name, 'before', $callback);
} public function after($name, $callback) {
$this->dispatcher->hook($name, 'after', $callback);
}

要获得类(如上,实际存在dispatcher中),需要通过方法调用(因为是通过 __call 实现的):

    $request = $this->request();
$response = $this->response();
$router = $this->router();

变量可以直接通过 get 获得

5、错误处理 handleErrors 和 配置

通过 set_error_handler 和set_exception_handler 设置自定义错误处理代替php默认的处理,也是php框架的标配了。

配置 就保存在 Engine 类的vars 里面,可以通过 set,get方法处理

Flight类 只有静态方法,且全部委托 Engine 对象,

Engine对象 

用来管理变量,类或事件的方法,如 set,get,register,map,before,after 就是所谓核心方法,

而所谓扩展方法,指注册到 Dispatcher中的事件,其实也是函数。而系统的事件,也是在 Engine中实现的。

Engine对象中,核心方法管理对象和事件,扩展方法则把事件任务分给了dispatcher ,对象任务分给loader

系统事件

1、start

读取request,路由

设置输出缓存 和配置(就是变量,这些设置是在engine->ini中设置的,且硬编码无配置文件)

添加 after hook,这个事件也就是调用stop事件,这个此时动态添加的hook事件也会执行,最终输出缓存

匹配分发路由,

2. stop

简单的输出缓存(根据上面,此事件作为 start事件的hook after事件被自动调用的。

理解Flight框架核心的更多相关文章

  1. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  2. 《深入理解Spark:核心思想与源码分析》(第2章)

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  3. 《深入理解Spark:核心思想与源码分析》一书正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  4. 《深入理解Spark:核心思想与源码分析》正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  5. 理解maven的核心概念

    原文出处:http://www.cnblogs.com/holbrook/archive/2012/12/24/2830519.html 好久没进行java方面的开发了,最近又完成了一个java相关的 ...

  6. Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

    本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...

  7. Vue框架核心之数据劫持

    本文来自网易云社区. 前瞻 当前前端界空前繁荣,各种框架横空出世,包括各类mvvm框架横行霸道,比如Angular.Regular.Vue.React等等,它们最大的优点就是可以实现数据绑定,再也不需 ...

  8. 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  9. 通过Ruby On Rails 框架来更好的理解MVC框架

    通过Ruby On Rails 框架来更好的理解MVC框架   1.背景    因为我在学习软件工程课程的时候,对于 MVC 框架理解不太深入,只是在理论层面上掌握,但是不知道如何在开发中使用 MVC ...

随机推荐

  1. 菜鸟学习Spring——60s使用annotation实现简单AOP

    一.概述. AOP大家都知道切面编程,在Spring中annotation可以实现简单的AOP列子.下面还未大家介绍几个概念: Aspect 对横切性关注点的模块化. Advice 对横切性关注点的具 ...

  2. Sqlserver中char,nchar,varchar与Nvarchar的区别分析

    1. char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率极高,比如定义char(10),那么不论你存储的数据是否达 到了 ...

  3. hdu 1622 Trees on the level

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1622 小白书上的题... #include<algorithm> #include< ...

  4. Go语言类型switch

    switch还可以用于判断变量类型.使用方式为T.(type),即在变量后加上.(type).见代码: package main import ( "fmt" ) func mai ...

  5. ios学习笔记之block在ios开发中的应用

    一.什么是Blocks      Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二. ...

  6. centos 安装phantomjs

    sudo yum install gcc gcc-c++ make git openssl-devel freetype-devel fontconfig-devel git clone git:// ...

  7. 跨域访问-需要设置HTTP响应标头设置

    跨域访问-需要设置HTTP响应标头设置 前提:服务端网站的配置(被请求的网站) 1.需要在IIS服务器站点的功能视图中设置HTTP响应标头: 2.双击“HTTP响应标头”进入设置界面 3.点击右侧添加 ...

  8. [转]Ubuntu 12.04开机自动挂载Windows分区

    [转]Ubuntu 12.04开机自动挂载Windows分区 http://www.cnblogs.com/A-Song/archive/2013/02/27/2935255.html 系统版本:Ub ...

  9. netstat用法

    netstat - 显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组. 总 netstat [address_family_options] [--tcp|-t] [--udp|-u ...

  10. EasyUI datagrid 动态绑定列

    20140604更新,发现了两种写法,第二种写法更佳 第一种: 查了很多资料,有点乱 首先声明一下这里必须要用easyui1.3.1 不多说直接上代码: 首先打开jquery.easyui.min.j ...