GPF简介

GPF是一个非常简陋的PHP"框架",出于个人想法而开发.
GPF 是 G PHP Framework 的缩写,其中“G”表示我的名字,可以是gevolution90,也可以是g0。
项目托管在github上:<https://github.com/nameG0/gpf>
关于GPF的开发原因可以参见 [GPF开发记录](http://blog.csdn.net/gevolution90/article/details/8870872).
实际上,严格来讲,GPF并不是一个"框架",只是一些PHP函数而已.

GPF的目标是:帮助整合各种现成代码,更快更容易地**完成工作**.

GPF考虑了两种情况:
* 一是全新开发一个项目.
* 二是在一个现成的项目上进行二次开发或维护.

因此GPF没有像常见的PHP框架那样规定代码的目录结构,否则在遇到现成项目时就没用武之地了.而维护现成项目又是很常见的情况.
但GPF有一种建议使用的目录结构,在上面说的两种情况下都可以使用,并且不会与像PHP-FIG这种规范冲突,但还是有可能会与常见的PHP框架的一些规范冲突.

首先把一个项目的代码分成两大类:
* 一是功能类代码.
* 二是逻辑类代码.

像常见的PHP框架,GPF本身,ORM实现,Smarty,PHPExcel这类就属于功能类代码,即常说的"第三方代码"或"代码库".
读写数据库的SQL语句,处理浏览器请求的代码,项目本身的逻辑等,属于逻辑类代码,即常说的"业务逻辑".

功能类代码全部放在 0lib 目录中.
逻辑类代码放在 0module 目录中,以"模块"的概念出现并强制模块化.
在 0lib 目录中,每一个文件夹为一个单位,当第三方代码只有一个源代码文件时,也需要建立一个目录进行存放.
在 0module 目录中,每一个文件夹是一个"模块",文件夹内就是此模块的所有相关文件.

比如:
/0lib/phpexcel/ -- PHPExcel功能
/0module/admin/ -- 后台管理模块
按照GPF的思路,一个项目的主要源代码不是放在 0lib 就是放在 0module 中.
且响应浏览器请求的代码(比如MVC中的控制器)总是放在 0module 中.
像GPF本身,属于功能性代码,所以放在0lib目录中, eg.
/0lib/gpf/

在项目中建议使用单一入口的结构组织处理请求的代码,而不是让处理请求的代码散落在不同的目录中.
而且像URL路由这类功能,是要依赖单一入口结构才能实现的.
GPF建议默认的前台入口文件为: /index.php .并且提倡可根据不同的需要建立多个不同的入口.比如后台入口文件为: /admin.php .

使用单一入口结构,便一定要使用MVC中的C(控制器).
GPF强烈建议控制器使用类型式进行定义,不要使用switch或if这些语言结构实现,因为语言结构无法像类的方法那样重复调用.
控制器放在模块目录下的 0c 目录中, eg.
/0module/admin/0c/index.class.php -- admin模块的index控制器
控制器类的类名使用 c_ 前序+模块名+控制器名, eg.
c_admin_index

gpf带有一个简单的控制器调用函数:gpf_ctrl. 把它放在入口文件中就可以方便地让入口文件自动调用对应的控制器了.

在项目开发过程中,include文件和实例化类是很常用的功能,gpf提供三个函数用于进行文件的加载和类的实例化:

单次包含文件:gpf\_inc. 函数内部调用require实现, 相当于require_once语句.

单次包含文件并可同时实例化文件中定义的类:gpf\_load. 函数内部调用 gpf\_inc 加载文件,若需要同时实例化加载文件中定义的类,会无参数地实例化指定的类.
并且一个类只会实例化一次,之后的调用会直接返回已实例化的对象.
gpf\_load的参数使用文件的绝对路径和完整的类名,不作任何硬性规定,可以使用gpf\_load加载任何PHP文件.

如果代码中需要显式地使用include或require语句(比如非单次包含或所包含的代码需要使用当前的变量作用域),可以使用gpf\_path函数直接返回待加载文件的路径: eg.
`include gpf_path('a.php');`
等于
`include 'a.php';`
之所以提供gpf_path函数,事关GPF的DEBUG模式,如果待加载文件不使用DEBUG模式,就不需要使用gpf_path了.

gpf_load函数的实例化方式是无参数直接实例化类,但类似数据库链接这样的对象,
需要带参数实例化并且同样需要单次实例化并在整个项目中都需要方便地访问实例化的对象.
所以GPF提供一个简单的"工厂"函数:gpf_factory, 专门负责这类"连接"类对象的实例化.

在开发过程中,获取$_GET,$_POST数据是另一个很常用的操作,gpf提供一套函数用于获取$_GET和$_POST数据,并进行一定程度的安全过滤.
它们是一堆以gpfi开头的函数.

下面用代码示例演示gpf_inc,gpf_load两个功能函数的用法:

**gpf_inc:单次包含**
假设需要在代码中包含/func.php函数定义源代码文件:
```php
gpf_inc("/func.php"); //首次加载/func.php文件.
//可以使用/func.php文件中定义的功能了.
gpf_inc("/func.php"); //第二次调用,不会做任何事,不会重复加载/func.php文件
```

**gpf_load:加载并实例化**
假设需要在代码中包含/class.php类定义源代码文件并实例化文件中定义的abc类.
```php
$abc = gpf_load('/class.php', 'abc'); //第一次调用,会加载/class.php文件并实例化abc类,返回abc类的实例对象.
//可以使用abc类了.
$abc = gpf_load('/class.php', 'abc'); //第二次调用,会直接返回已实例化的abc类的对象.
gpf_inc('/class.php'); //gpf_load内部是使用gpf_inc进行文件的包含,所以这里不会再加载/class.php文件.
```

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页