现在越来越多的人学习PHP,相信他们都会走到熟练使用某一开发框架的过程,本人也在走过这样的过程,并且走了许多弯路,因此本人业余时开发了一个简单的原理,清晰的开发框架,目的是使新手使用该开发框架后,能够初学者摆脱传统开发模式,写出漂亮,模块化的程序,并且举一反三,触类旁通其他框架,甚至自己能够设计自己的开发框架。而那些认为开发框架没用的人,那只能说明他们缺乏足够的开发经验。该开发框架参考了KFL开发框架的一些思想。
Power2php是一个简单的,开源的,易扩展(升级),高效的,面向对象的轻量级PHP MVC开发框架.遵循GNU General Public License (GPL) 开源协议发布. Power2php是为了简化企业级应用开发和敏捷WEB 应用开发以及为初学者摆脱传统开发模式而诞生的. Power2php会使开发变得更简单。
网址: http://power2php.sourceforge.net/
l 简单,也许是你见过最简单的WEB开发框架,它的核心代码只有十几行,因此只需很低的学习成本
l 清晰而不失灵活的MVC模式
l 基于常用的URL参数和表单隐藏域驱动的架构
l 模块化开发,很方便于大量代码的维护
l 默认使用PHP Include,比smarty模板引擎快
l 可自由的加入其他类库或模板引擎,如smarty,pear等
l 集成PDO抽象库(与pear相似),可以很方便的操作数据库
l 没有花哨的功能,它只是一个Framework
Power2php 对环境没有特殊的要求(除非你还在使用PHP3 ),只是如果你使用了附带的PDO抽象库操作数据库的话,那么你的PHP服务器上必须安装有PDO
l 面向对象基础
l 能理解PHP Include
Power2php虽然非常的简单,但你仍然需要有一定面向对象基础,起码你能够创建一个类或一个函数。如果你还没有掌握面向对象技术,那么强烈建议您学习此技术。
........................\config.php 开发框架的配置文件,主要一些全局常量
........................\index.php 入口文件
........................\readme.txt 说明文件
........................\core 开发框架的核心文件夹
........................\...\ common.php 开发框架的核心文件,用于分发控制器操作
........................\...\...\ controller.php 控制器的基类文件
........................\...\...\ controller.php 模型的基类文件
........................\application 应用程序文件夹,还可以放置如缓存,日志等
........................\...\ app_config.php 应用程序的配置文件,如数据库连接信息
........................\...\controls 控制器文件夹
........................\...\...\index.php 控制器文件
........................\...\...\ ... ... ...
........................\...\views 视图文件夹
........................\...\...\view_index.php 一些视图文件
........................\...\...\ ... ... ...
........................\...\models 模型文件夹
........................\...\...\saveinfo.class.php 模型文件
........................\...\...\ ... ... ...
........................\libs 引入的类库文件夹
........................\...\mypdo.class.php 附带的PDO抽象类库
........................\...\validation.php 附带的验证类库
........................\...\...\ ... ... ...
Power2php的目录非常的清晰和简洁,你也可以更改为你平时所习惯的目录结构,只需更改config.php的配置和core\ common.php的分发控制代码。
Power2php运行机制和原理很简单,一句话:通过传入特定的URL或表单值以分发给相应的控制器中某个函数进行处理,最后将控制器处理后信息呈现于所包含的视图中。
在WEB开发中,主要工作无外呼是显示页面和提交表单这两个工作。因此控制器通过URL访问来确定显示页面,得到信息后那么只需include(“要显示的视图”)。而处理表单只需要处理完后重定向或者输出某个信息。
为了最简单完成MVC模式开发的要求,在开发过程中,需要遵循3个规则:
l URL中都必须带有两个参数 ,分别是control和view,用于表明改URL将由哪一控制器及函数处理
l 表单提交中必须带有两个隐藏字段,分别是control和action,功能同上
l 控制器类的类名称应该和它的文件名是相同
另外注意linux下区分大小写,建议统一使用小写.
下图的例子将会帮助你理解Power2php是如何运行的:
上图中给index.php传入了两个参数control和view,此两个参数会交由../core/common.php文件以分发到index控制器中的view_index函数,也就是说control和view用来指定哪一控制器和控制器中的那个函数处理。最后将处理后的数据显示到view下vote/index.html中
同样当表单处理时,将通过两个隐藏域以指定交由哪一控制器和函数进行处理.如下例子:
<FORM name=form1 action="index.php" method=post>
<INPUT type=hidden name=control value="index" >
<INPUT type=hidden name=action value="add_vote">
…..其他表单字段
</FORM>
这样这个表单将会交由index控制器类中的post_add_vote()函数处理。
注意:如果表单是以get方式提交的话,那么那个action的字段名应改用
<INPUT type=hidden
name=view value="add_vote">
下面演示一个最简单的例子:hello word
首先将Power2php压缩包解压到你的PHP开发目录中,如我这里是: E:\xampp\htdocs\Power2php。分别在application下的controls创建index.php控制器,models下创建index_model.php模型类,views下创建index_view.php.目录结构如下图:
其中models/index_model.php的代码:
[code]
<?php
//helloword的模型类
class index_model extends Model{
//返回字符串
function getHelloWord(){
return "Hello,Phper!";
}
}
?>
[/code]
controls/index.php的代码:
[code]
<?php
session_start();
require(MODEL_DIR."/index_model.php") ;
// helloword的控制器类
class index extends controller {
//显示 helloword,当访问到index.php?control=index&view=index时,
function view_hello(){
$model=new index_model();
$hello=$model->getHelloWord();
include(VIEW_DIR."/index_view.html");
}
}
[/code]
views/index_view.html的代码:
[code]
<HTML xmlns="http://www.w3.org/1999/xhtml">
<HEAD>
<TITLE><?=$hello ?> </TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
</HEAD>
<BODY>
<h1><?=$hello ?></h1>
</BODY>
</HTML>
[/code]
最后运行 :
http://localhost/Power2php/index.php?control=index&view=hello
提示:你可以在config.php设置默认的首页URL,那么当你访问:
http://localhost/power2php/ 时将会跳转到默认的URL
在MVC开发框架中控制一般用于处理业务逻辑,表单验证,重定向,权限控制等。
在Power2php中控制器的角色与上相同。在Power2php中创建一个控制器就是创建一个PHP类, 建议你从core/controller.php的控制器基类继承。
如下典型的例子:
index_control.php 注意:此控制文件名必须和类名称相同:
[code]
<?php
session_start();
require(MODEL_DIR."/index_model.php") ;
// helloword的控制器类
class index_control extends controller {
//构造函数,通常用于权限认证
function index_control() {
if(!empty($_SESSION['user'])){
echo "你还没有登录呢";
die;
}
}
//显示首页,当访问到index.php?control=index&view=index时,执行以下函数
function view_index(){
$model=new index_model();
$hello=$model->getHelloWord();
include(VIEW_DIR."/index.php");
}
/**
* 注册一个用户
* 当如下表单提交时交由此函数处理
* <form name="form1" acion="index.php" method="POST">
* <input type="hidden" name="control" value="index_control">
* <input type="hidden" name="action" value="adduser">….
* </form>
*/
function post_adduser(){
$username=$_POST['user'];
$password=$_POST['password'];
$model=new index_model();
$flag=$model->addUer($username,$password);
if($flag>0){
header("location:index.php?control=index&view=succ");
}else{
echo "不能注册此用户";
}
}
}
[/code]
在MVC开发框架中模型一般用于进行持久化操作。如操作数据库,写入和读写文件,访问其他接口等。在Power2php与控制器相似,创建一个模型其实就是创建一个类。
但建议你继承于core/model.php中的Model类,如果你继承类,并且在applocation/app_config.php正确配置数据库连接,那么操作数据库将非常的简单!
如下典型例子
[code]
<?php
// 模型 投票 的数据库操作类
class Vote extends Model
{
//获得所有或分类的投票主题信息,返回多条记录
function getTopic_page($start,$end,$type,$pagesize=16) {
$sql="SELECT * FROM topic WHERE top_state !=0 limit $start,$end ";
if(!empty($type)){
$sql="SELECT * FROM topic WHERE top_state !=0 AND top_catlog='$type' limit $start,$end ";
}
return $this->db->getAll($sql); //返回多条记录
}
//通过主题ID获得主题信息 ,只会返回一条记录
function getTopicByID($top_id) {
$sql="SELECT * FROM topic WHERE top_id='$top_id' ";
return $this->db->getRow($sql);
}
//条件以个答案
function addNewSub($top_id,$answer) {
$sql="INSERT INTO `sub_vote` ( `sub_title` , `top_id` )
VALUES ( '$answer', '$top_id'); ";
return $this->db->query($sql);
}
}
[/code]
在Power2php中,视图就是普通的PHP文件,为什么要使用PHP Include文件?个人认为使用PHP Include是要比模板引擎要快的,另外视图中可以使用PHP脚本,这样会更灵活。但建议你在开发中不要在视图中放入控制代码,控制代码应该在控制器中完成,视图最多只是显示。因此使用<?= $变量?> 和 foreach,for等就可以了.当然视图中也可以使用其他任何模板引擎。
下面演示如何使用Smarty-2.6.16模板引擎作为视图引擎
首先将Smarty-2.6.16压缩包解压到Power2php目录的libs下,
其次将Smarty-2.6.16目录下的demo的templates,configs,templates_c文件夹复制到在Power2php目录的application/view下
在application/controls下创建控制器名为smarty_demo.php,代码:
[code]
<?php
require PROJECT_DIR.'/libs/Smarty-2.6.16/libs/Smarty.class.php';
// 演示 smarty 的控制器
class smarty_demo extends controller {
var $smarty=null;
//构造函数,可用初始化数据
function smarty_demo() {
$smarty = new Smarty;
//指定smarty的模板目录以及配置目录,否则出错
$smarty->template_dir=VIEW_DIR."/templates";
$smarty->compile_dir=VIEW_DIR."/templates_c/";
$smarty->config_dir=VIEW_DIR."/configs/";
$this->smarty=$smarty;
}
//显示 smarty DEMO的函数
function view_smarty(){
//指定smarty的模板目录
$smarty=$this->smarty;
$smarty->compile_check = true;
$smarty->debugging = true;
$smarty->assign("Name","Fred Irving Johnathan Bradley Peppergill");
$smarty->assign("FirstName",array("John","Mry","Jaes","Henry"));
$smarty->assign("LastName",array("Doe","Smith","Johnon","Case"));
$smarty->assign("Class",array(array("A","B","C","D"), array("G", "H"),
array("I", "J", "K", "L"), array("M", "N", "O", "P")));
$smarty->assign("contacts", array(array("phone" => "1", "fax" => "2", "cell" => "3"),
array("phone" => "55-4444", "fax" => "5333", "cell" => "760-1234")));
$smarty->assign("option_values",array("NY","NE","K","IA","OK","TX"));
$smarty->assign("option_output",
array("New rk","Nraska","Kaas","Ia","Okoma","Teas"));
$smarty->assign("option_selected", "NE");
$smarty->display('index.tpl');
}
}
?>
[/code]
最后运行地址 http://localhost/Power2php/index.php?control=smarty_demo&view=smarty
结果:
Power2php默认附带了PDO的抽象类库,利用此类库可以非常方便操作数据库。
将application/app_config.php正确配置数据库连接,然后去掉模型基类core/model.php中注释。那么当模型类继承于基类后。可以直接使用函数(与pear相似)
$this->db->getAll(),$this->db->getRow(),$this->db->getOne(),$this->db->query()
以返回相应的数据
详细可查看libs下的mypdo.class.php
当稍微大一些的项目,模块和文件将会很多,那么控制器,模型,视图文件不可能都放置于controls,models,views的根目录下。在Power2php很容易解决此问题。
如果要增加一个模块new_module那么,你需要这么做:
在application/controls新建立一个文件夹new_module用于放置该模块的控制器
在application/views新建立一个文件夹new_module用于放置该模块的视图
在Power2php跟目录创建该模块的入口文件new_module.php,内容如下:
<?php
/**
* 模块new_module的入口文件
*/
session_start();
require("config.php");
require(PROJECT_DIR."/core/common.php");
?>
那么访问地址将如下
http://localhost/Power2php/new_module.php?control=控制器名&view=函数名
在源码中已经存在了划分模块的例子,如hello world,分页,投票系统,集成smarty模板引擎视为各自独立的模块,它们都处于同一个开发框架下.
最后希望您在power2php中学到或参考到一些东西.