如何自己写一个PHP框架
[size=small][color=darkred]在PHP的论坛中总是听到有人对PHP的OOP支持说三道四的,说这有缺陷,那里不足,但是都拿不出实际的例子。原来说过要和大家说说这事,但是一直很忙,现在算是抽了些时间了,所以把我刚刚做过的一个项目的框架拿出来和大家探讨一下。这个项目99%的代码是用oop方式编写的,感觉PHP对于OOP支持非常好,不是一般的好,是非常的好。有由于项目本身是一个商业项目所以源代码不好公布出来,但是基本框架还是可以说一说的,而且经过简化的例子更容易理解一些。如果你对PHP中的OOP还不太了解,还是就此打住吧,先去看看手册,或者基础读物再来看也不迟,反正这个是贴子没有长腿也跑不了。
长话短说,立刻开始吧。我这里会用到一个简单的例子,只有一个半的功能。一个是向浏览器发送一句"Hello, I can say OOP in PHP world!",另外半个功能是从数据库中进行一个查询然后输出到浏览器,说它是半个功能是因为只是作为一个例子讲讲没有实际的数据库操作。
首先从我的第一个文件index.php 开始介绍吧。我的index.php文件是这样的:
<?php include_once ('config.php'); include_once ('class.Application.php'); $app = & new Application(); $app->run(); ?>
<?php class Application { function Application() { } function run() { } } ?>
<?php class Page { function Page() { } function show() { //不能直接调用这个方法一定要在子类中去具体实现。 die('You can not use this funciton directly from Page class'); } } ?>
<?php require_once ("class.Page.php"); class HelloPage extends Page { function HelloPage() { parent::Page(); } function show() { echo "Hello, I can say OOP in PHP world!"; } } ?>;
<?php require_once ("class.Page.php"); class DatabasePage extends Page { function DatabasePage() { parent::Page(); } function show() { //做一些数据库操作然后将结果显示出来。 } } ?>;
<?php class Application { function Application() { } function getAction() { } function run() { $pageClass = $this->;getAction(); include_once ("class.".$pageClass.".php"); $page = & new $pageClass(); $page->;show(); } } ?>
<?php require_once ("class.Database.php"); class Application { var $db;//数据库对象 function Application() { $this->;db = & new Database(DB_HOST,DB_NAME,DB_LOGIN,DB_PASS);//$db 现在是一个数据库对象了 } function getAction() { return $_GET['action']; //简单的实现 getAction; } funciton & getDatabase() { return $this->;db; } function run() { $pageClass = $this->;getAction(); include_once ("class.".$pageClass.".php"); $page = & new $pageClass($this); //这里是唯一做了手脚的地方,将这个Application对象传给页面对象。 $page->;show(); } } ?>
<?php require_once ("class.Page.php"); class DatabasePage extends Page { var $db; function DatabasePage(&$app)//将Application对象作为参数接受。 { parent::Page(); $this->;db = $app->;getDatabase();//获得 Application 中的数据库对象。 } function show() { $sql = 'SELECT * FROM sale_orders';//简单的一个 SQL 例子。 $results = $this->;db->;query($sql);//query 是 Database对象的一个公共的方法,通过它向数据库提交SQL查询。 ...;//做一些操作把得到的结果显示出来。 } } ?>