南斗工作组

很多东西不记下来,总归是回忘记的

[原创]一些基本设定和框架总体设计---PHP框架编写123

| |
00:50 , P.Qingliang
一些基本的要求和设定
为了使用某些比较特殊的功能以及交流上的方便,我们进行了一些约定。
在这里,首先我们要求PHP的版本至少是5.0,我们推荐版本在5.1或以上, 5.1在性能上比5.0要快得多。其次,我们要进行一些基本的约定:
1.  类命名:

类的命名我们采用如下的方法:
N_Controller_Abstract
这个类的名字包含了它的路径,它应该位于导入的某个类路径(Class Path)下的N/Controller/Abstract.php文件中。

2.  类路径(Class Path):

你可以将类路径看成类似与include_path的一样东西,当我们寻找某个类时,我们会先根据类的名称产生一个类名称路径(类似上面的N/Controller/Abstract.php),然后依次在类路径下寻找。

3.  命名方式:

我们采用的是类似这样的方法、函数命名方式:
getFileExt
而不是
GetFileExt
也不是
get_file_ext

框架总体
  我们先简单的将MVC的执行过程封装起来,为次我们需要另外一个类,我们暂时命名为N,类实现放在N.php文件中,所有的文件都置于N文件夹下,它的所有方法我们都设计为静态方法,这样不需要实例化就可以直接调用它的方法:




是的,一个框架的启动类就是这么简单,当然要实际的运行还需要添加诸多功能,下面我们开发为其添加一些必要的东西。

首先是类的寻找问题,根据我们前面的约定,我们已经可以很轻松的知道类的路径了,但是计算机不知道。在PHP5及其之后的版本,提供了autoload功能,即使你不主动加载类文件,php引擎也会帮助你寻找指定的类文件的,它很方便,只是牺牲了一定的效率,我们建议在任何需要的时候主动加载类,因为某些时候自动寻找类可能是相当费时的,当然你不是必须这样做。为了能够主动加载类,我们需要提供一个方法来主动加载,因为N是整个框架运行的基点,所以我们可以将加载类作为它的一个静态方法来实现,最初版本:

这样PHP会在./N/Controller/Abstract.php文件中寻找N_Controller_Abstract类,但是问题来了,如果我们N文件夹不是放在根目录下,例如是放在Libs文件夹下,那么PHP就会抛出异常表示该类找不到。
点击在新窗口中浏览此图片点击在新窗口中浏览此图片
  
上面是两种常见的目录安排方式(有些为了安全考虑,甚至将库文件放在站点根目录之外)。第一种N文件夹在根目录下(learning为根目录),第二种在根目录的Libs/文件夹下(schoolPlant为根目录)。我们的N.php是被首页文件(假设为index.php)直接包含了,所以文件包含也是相对index.php的。为了解决这个问题,我们需要导入一些目录作为类目录,下面展示了部分修改后的N类:

这样我们只要在index.php文件中加入如下代码即可寻找到我们的类文件了:

另外我们还需要给类添加配置控制功能,对于任何框架都是需要可伸缩的配置功能的。直接看代码吧:(省略重复代码)


loadAppIni方法有两种传参方式,由于php本身不支持重载,所以我们采用了一些技巧来实现,关键的代码就是func_get_args()。一种是直接传递文件名,文件的内容应该类似下面的格式:


这样我们require之后,就直接得到了一个数组,将它合并到N类的$_ini属性中之后就可以方便的通过数组索引来访问配置了。
另一种方式是传递键值对,例如 N::loadAppIni(‘defaultControllerName’, ‘index’);

现在我们就可以在类N的init方法中添加一些其他的初始化代码了:


在这里,我尽量少的使用全局变量,而更多的是用类N的成员变量来保存某些全局配置,原因有二:1.我们尽量的希望以面向对象的方法来实现,在这里完全没有必要使用全局变量来保存 2.为了防止直接修改某些重要的全局配置,使用约定方式修改比直接修改往往要安全的多。 另外一个算不上原因的原因是PHP6将取消对全局变量的支持。

里面的几个文件我打包一下,在文章的最后面可以下载。

到这里N类的功能已经可以正常的运行一个框架了,在之后的过程中,我们还会添加一些需要的功能。

下一篇我们开始丰富各个MVC组件的功能。

下载文件 (已下载 9 次)


最后编辑: Model.King 编辑于July 3, 2008 22:32
类别:PHP相关 | Tags: , , | 0 条评论, 84 次阅读
网友评论(0):
发表评论:

昵称: 
电邮:
网址: