+ -
当前位置:首页 → 问答吧 → FleaPHP框架源代码分析(一)

FleaPHP框架源代码分析(一)

时间:2009-11-15

来源:互联网

  各位网友们,大家好,我是一名FleaPHP的初学者,最近突然冒出要研究fleaPHP的框架的想法,于是决定将每次学习的笔记贴出来,希望能和大学一起学习。因为刚开始接触Flea,必定会有许多不足的地方,希望各种大虾们能够不吝赐教哦!同时,我会把我个人觉得框架中需修改的部分贴出来,希望我的想法能为flea做点贡献,咯咯,如有不对的地方也请老廖原谅一下新手吧。有可能的话,也指点一下,不胜感激啊!

  顺便说一下:我的个人技术博客PHP52前几天也开通了,http://www.php52.com,它代表着一年的52个星期,都要好好学习PHP,^_^  希望能通过这个平台结交更多学习PHP的朋友,大家有空也帮我踩踩哦!好了,废话不多说了,开始学习啦:
(我研究的代码都是FleaPHP的最新版本1.7.1524)

  首先,我们来看一下FleaPHP的入口文件(FLEA.php)吧,我们网站所有的请求都是经过它来处理的,因此它是最重要,也是最值得研究的
一部分

    入口文件的最开头部分是对一些程序所需常量的一些定义,主要有以下几个部分:

  1)  FleaPHP程序文件基本定义(包括文件载入时间,版本号,PHP版本定义)
        因为FleaPHP要同时兼容PHP4和PHP5,所以有PHP版本常量的定义
        
    2) FleaPHP中URL显示模式的定义
        什么是URL模式呢?其实说白了,就是我们访问网站时浏览器上显示的url的显示方式
        FleaPHP有三种模式:
             标准模式(URL_STANDARD): 就是我们最平常看到的未经处理过的url格式.
                例如:http://www.php52.com/index.php?controller=default&action=show
             路径模式(URL_PATHINFO):就是把url中的参数用文件夹路径的形式来表示的一种格式
                例如:http://www.php52.com/index.php/default/show 是不是漂亮了很多
             重写模式(URL_REWRITE):就是使用自己定义的url展现格式,
                如果要详细了解这方面的知识,可以到网上搜索一下url的重写,路由,重写规则等相关的技术资料,这里不详细介绍
               
    3) RBAC基本角色常量定义
        这里有必要解释一下什么是RBAC,RBAC是英文Role-Based Access Control的缩写,中文意为:基于角色的访问控制,其实这东西就是相当于我们网站后台管理系统对于不同用户的一个管理,就好比一个论坛中有管理员,版主,会员,他们都有各自的权限,管理员可以做任何事,版主可以加分加精,会员只能发贴等等。这些东西的控制就是RBAC。如果大家对我的解释还不是很清楚的话,建议到老廖的博客上看看有一篇叫做《如何使用 RBAC 组件实现访问控制》的文章,他对Rbac的含义的讲解很是生动,并且把RBAC类的使用方法进行了全面的描述。呵呵~好了,我们来看下这几个权限吧:
        RBAC_EVERYONE: 表示任何用户
        RBAC_HAS_ROLE:   表示拥有角色的用户
        RBAC_NO_ROLE:     表示未拥有角色的用户
        RBAC_NULL:           表示该设置没有值
        ACTION_ALL:          表示控制器中的所有动作
          小建议:为什么不把ACTION_ALL的常量名改为:RBAC_ACTION_ALL 这样应该会更直观一点啊~
         
    4) FleaPHP全局变量定义
        我个人认为这是FleaPHP的精华部分,很佩服老廖的这个想法,他把程序信息,使用过的对象,错误信息等各种常用对象和信息以数组的形式
存储在一个全局变量中,避免重复定义和调用,加快了程序的运行速度,减少了内存消耗,许多人说Fleaphp速度快,这个全局变量功不可没啊!
        下面我来详细看看这个全局变量的定义:
            $GLOBALS[G_FLEA_VAR]=array(
                'APP_INF' =>  array(),
                'OBJECTS' =>  array(),
                'DBO'     =>  array(),
                'CLASS_PATH'  =>  array(),
                'FLEA_EXCEPTION_STACK'  =>  array(),
                'FLEA_EXCEPTION_HANDLER'  =>  null,
            )
            
           APP_INF:  这个数组存储的是程序的配置信息。用过FleaPHP的同学们都知道,我们会建立Config.php来定义程序中的一些配置信息,像缓存路径,控制器标识符,程序默认语言等等...这些信息在FLEA.php运行时会自动把它们导入到APP_INF数组里,当我们使用loadAppInf(),getAppInf(),getAppInfValue(),setAppInfValue(),setAppInf()其实都只是在对这个数组进行操作。
           OBJECTS:  这个数组存储的是程序创建过的对象。好比说,我们在程序中用getSingleton)创建了一个对象,FLEA会把它存储到这个数组中。getSingleton(),register(),isReistered()其实都是只是对这个数组的操作。
           DBO:     存储数据库的配置信息。这个不用多说了吧?
           CLASS_PATH:用来存储用户自己建立的类的存放路径。大家联想一下import()函数,其实它就是把用户创建的类的路径存到这个数组里。就像FleaPHP中的每个实例中的app目录里存的都是用户自己定义的类,在使用这些类之前,把这个路径import到程序中就可以了,当然如果你的类存在不同的目录,只要分别导入即可。
           FLEA_EXCEPTION_STACK 和 FLEA_EXCEPTION_HANDLER: 这两个数组是用来实现FleaPHP模拟的错误机FLEA_EXCEPTION存储的是错误对象,FLEA_EXCEPTION_HANDLER存储的是错误对象的调用函数.
  
    5)  其它常量的设定
        DS:  对DIRECTORY_SEPARATOR的缩写定义,但老廖在后面的代码中有些地方还是直接使用了DIRECTORY_SEPARATOR到时我会指出来。这里我还有必要指出一点,在Windows和Linux下绝对路径时,DS是不一样的,相对路径时还是没有问题的,建议大家在写代码的时候,还是尽量使用DS。常用的路径最好定义好常量。例如:可以为根主目录定义ROOT_DIR, 程序主目录定义APP_DIR, 模板目录定义 TPL_DIR, 图片目录 APP_IMG ...这样方便代码的维护,而且也建议程序的所有常量定义均放入统一的定义文件中,这样以后修改维护起来就会很方便了。
      DEPLOY_MODE:  是否启用布暑模式,如果设为false,则为开发模式,会开启错误提示,日志记录等。当程序开发完毕后
,要将此模式打开,即设为true,这样可以加快程序的运行速度,切记。
      NO_LEGACY_FLEAPHP:  表示是否导入兼容性文件,如果程序设定了此值为false,或未设置此值,刚会导入兼容文件,以实现Flea新旧版本的兼容,如果是新开发的程序,为了减少文件的加载,建议将此常量设置为true.
      
      我们再看看类定义前的最后一段
      if(!defined('E_STRICT')){
          define('E_STRICT',2048);
        }
        if(DEBIG_MODE){
          err_reporting(error_reporting(0)&~E_STRICT);
        }else{
          error_reporting(0);
        }

        这段代码就是表示如果设定了程序为调试模式,则显示所有错误信息。但在代码中,会发现有一个E_STRICT,2048,很多人可能对这两个东西不太理解,那好,我建议大家看一下phpchina的phper杂志的第三期中一篇叫做《PHP面向对象中的异常处理》的文章,即可很快明白。
        其实,在PHP4中是有E_STRICT这个常量的,但是而在PHP5则改成E_ALL了,作者老廖考虑到这一点,自己定义了一个常量,定义值为2048,那么2048表示什么?不错,就是表示E_ALL,那我们来看下面这张错误常量对照表:
        1  E_ERROR                    2  E_WARNING                   4  E_PARSE                      8 E_NOTICE
        16  E_CORE_ERROR        32  E_CORE_WARNING        64  E_COMPILE_ERROR     128 E_COMPILE_WARNING
        256 E_USER_ERROR        512 E_USER_WARNING       1024  E_USER_NOTICE     2047  E_ALL
        
        一目了然了吧?建议大家看下我刚才说的那篇文章,你会对PHP的错误处理有更进一步的认识的。

到这里我们就将入口文件中的常量定义,参数设定这一小部分学完了。不怎么涉及到代码的分析,大都是概念性的东西。
下一节,我们将具体分析FleaPHP的入口文件中的FLEA类。大家有什么想法就赶紧来喷吧,我会继续努力的,嘿嘿~~~

作者: 5650137   发布时间: 2009-11-15

顶!不错不错,值得鼓励!用过几种框架,感觉框架的确有助于开发,但还是有很多不尽人意的地方,因此还是自己写了个基本框架,然后开发项目的时候把常用的库加载进去就OK了

作者: scckfzx   发布时间: 2009-11-15

哈哈,终于有人给我回复了,好感动哦
我原来也写过框架,但整体设计上还是老廖写得简洁和高效,在内存,cpu的损耗方面考虑得多,特别是DB那一
块儿做得很强。值得学习。
今天晚上我再发源码分析第二节,希望大家关注哦!

作者: 5650137   发布时间: 2009-11-16

有点强。。支持

作者: oik550   发布时间: 2009-11-16

不错,分析很到位

作者: heixiake   发布时间: 2009-11-16