创造世界上最简单的 PHP 开发模式
更新时间:2006年12月04日 00:00:00 投稿:mdxy-dxy
这篇文章主要介绍了创造世界上最简单的 PHP 开发模式
, 5);
$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);
dbDisconnect();
renderTpl(’list2.htm’, $data);
?>
--------view.htm--------------
<!-- BEGIN content -->
编号:{id}<br>标题:{title}<br>内容:{content}
<!-- END content -->
--------view.php------------------
<?php
require_once "config.inc.php";
dbConnect();
$data = array();
$data[content] = getArticle((int)$_GET[id]);
dbDisconnect();
renderTpl(’view.htm’, $data);
?>
八:文章添加实现和模板处理(万里长征的再来一步)
---------------new.htm-----------
<form action="add.php" method="post">
标题:<input type="text" size="20"><br>
内容:<textarea cols="50" rows="4"></textarea><br>
<input type="submit" value="提交">
</form>
---------------new.php------------
<?php
require_once "config.inc.php";
renderTpl(’new.htm’, array());
?>
---------------CoreUtil.php--------------
<?php
function doPostVar(&$data){
$keys = array_keys($data);
foreach($keys as $key){
$data[$key] = addslashes(htmlspecialchars(trim($data[$key])));
if($data[$key]==null) $data[$key] = "$key default";
}
}
?>
---------------add.htm------------
<!-- BEGIN success -->
{content}
<!-- END success -->
---------------add.php------------
<?php
require_once "config.inc.php";
dbConnect();
$data = action();
doPostVar($data);
addArticle($data);
$result[success][content] = "文章添加成功";
dbDisconnect();
renderTpl(’add.htm’, $result);
function action(){
$data = array();
$data[title] = $_POST[title];
$data[content] = $_POST[content];
$data[datetime] = date(’Y-m-d H:i:s’);
$data[pid] = 1;
return $data;
}
?>
这样一个最最简单的文章的发布系统就完成了,不知道对您有什么收获没有。
九、总结
程序写完了,大家来总结一下吧,看看实现过程,应该可以说是简单明了吧。
1、统一实现数据库访问接口。更改后台数据库结构的时候,只要简单的修改相应的接口函数,其他部分的php代码根本就不用理会。
2、整个系统php代码和html代码分开管理,php代码前台实现起来也很简单,你也应该已经可以发现了,基本上是在10行代码左右。
3、可以任意的扩充功能。用函数对新的功能进行包装后,在具体的前台的查询显示页面中只有加入对相应的函数的简单的调用就可以了,一行代码就搞定了。
4、代码复用。通过对功能的包装,减少了大量的不必要的重复代码工作,效率应该是提高了很多吧?
5、可以移植性。如果将来做其他的网站,要是遇到了和这个项目相同的实现功能,你可以怎么做呢?把这里的函数和数据库结构copy过去,修改一下新项目的模板,是不是就可一完成这个新的项目了呢?根本就不用考虑修改php代码。
6、结构代码清晰。别人可以轻易的和你共同开发一个项目,代码冲突也会减少至最低。
当然实际工作中遇到的情况可能比这个例子复杂的多,但是再复杂的任务都是可以拆分的。
十、后言
不知道大家有没有学过jsp和servlet这样的东西,他们有很多优秀的设计思路,值得我们去研究和copy(说句实在话,有时间的都应该去接触一下java,不是为了学习这门语言而学习,是要学习他的设计模式和优秀的功能实现方式)。jsp至少有两样东西对我们很有用,action和filter。
action是主要是处理一些事件逻辑,就像add.php中我们定义的action()函数一样,用来验证和获取表单提交上来的数据。当然这样写的代码量和你以前方法的代码量是一样的,好像没有什么区别,但是它实现了代码的分离,结构是不是比你以前的方法清晰很多呢?
filter是一个过滤功能,用来过滤和重新定向网络的访问,对一些非法的请求和错误的请求进行重新的定向。让我们来通过一个后台管理的程序来看看他具体的作用。
将下面的这个函数copy到你的CoreUtil.php里面,这个函数是一个后台管理登陆的过滤函数,一个是不在本地缓存web页面的函数:
function windowNoCache($cache){
if(!$cache || headers_sent()) return ;
header(’Expires: ’.date(’D,d M Y H:i:s’,mktime(0,0,0,1,1,2000)).’ GMT’);
header(’Last-Modified:’.gmdate(’D,d M Y H:i:s’).’ GMT’);
header(’Cache-control: private, no-cache,must-revalidate’);
header(’Pragma: no-cache’);
}
function isAdminLogin(){
if($_SESSION[relogin]=="ok") return;
if($_SESSION[adminuser]!=SYS_ADMIN_NAME){
$_SESSION[relogin] = "ok";
die("<script language=\"javascript\"> top.location=’adminlogin.php’; </script>");
}
$_SESSION[relogin] = "no";
}
然后在 根目录 底下加上如下的文件
------------adminconfig.inc.php------------
<?php
define(’SYS_ADMIN_NAME’, ’hello’); //后台管理登陆名
define(’SYS_ADMIN_PASSWORD’, ’hello’); //后台管理登陆密码
include ’config.inc.php’;
windowNoCache(true);
isAdminLogin();
?>
------------adminindex.php----------------
<?php
require_once "adminconfig.inc.php";
renderTpl(’adminindex.htm’, array());
?>
------------adminlogin.php------------------
<?php
include "adminconfig.inc.php";
if($_POST[name]==SYS_ADMIN_NAME && $_POST[code]==SYS_ADMIN_PASSWORD){
$_SESSION[adminuser] = SYS_ADMIN_NAME;
header("location: adminindex.php");
}else{
renderTpl(’adminlogin.htm’, array());
}
?>
在 smart/template 目录下面加上如下的文件
------------adminlogin.htm------------------
<form name="form1" method="post" action="">
<input type="text" name="name" size="20" value="">
<input type="password" name="code" size="20" value="">
<input type="submit" name="Submit" value=" 登 陆 ">
</form>
------------adminindex.htm----------------
<h2>您好欢迎登陆后台管理</h2>
现在访问adminindex.php看看会发生什么事情,然后用adminconfig.inc.php里面设定的用户名密码登陆。这种功能在web的很多地方都可以派上用场,应该是一个好的方法吧。其他的后台访问的页面只要也都加载了adminconfig.inc.php ,就不用再考虑后台访问权限的问题了。
十一 附录
简单的隐藏文件的扩展名,搞晕浏览者,让他不知道你是用什么语言编的程序。
就以list1.php为例子吧,
1、我们修改list1.php的名称为list1.tmp
2、进入命令行窗口(dos窗口),在web的目录下面建立一个文件,文件名是“.htaccess”。
3、编辑“.htaccess”文件,输入以下的内容
AddType application/x-httpd-php .tmp
通过浏览器访问list1.tmp,看看是不是ok了。
$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);
dbDisconnect();
renderTpl(’list2.htm’, $data);
?>
--------view.htm--------------
<!-- BEGIN content -->
编号:{id}<br>标题:{title}<br>内容:{content}
<!-- END content -->
--------view.php------------------
<?php
require_once "config.inc.php";
dbConnect();
$data = array();
$data[content] = getArticle((int)$_GET[id]);
dbDisconnect();
renderTpl(’view.htm’, $data);
?>
八:文章添加实现和模板处理(万里长征的再来一步)
---------------new.htm-----------
<form action="add.php" method="post">
标题:<input type="text" size="20"><br>
内容:<textarea cols="50" rows="4"></textarea><br>
<input type="submit" value="提交">
</form>
---------------new.php------------
<?php
require_once "config.inc.php";
renderTpl(’new.htm’, array());
?>
---------------CoreUtil.php--------------
<?php
function doPostVar(&$data){
$keys = array_keys($data);
foreach($keys as $key){
$data[$key] = addslashes(htmlspecialchars(trim($data[$key])));
if($data[$key]==null) $data[$key] = "$key default";
}
}
?>
---------------add.htm------------
<!-- BEGIN success -->
{content}
<!-- END success -->
---------------add.php------------
<?php
require_once "config.inc.php";
dbConnect();
$data = action();
doPostVar($data);
addArticle($data);
$result[success][content] = "文章添加成功";
dbDisconnect();
renderTpl(’add.htm’, $result);
function action(){
$data = array();
$data[title] = $_POST[title];
$data[content] = $_POST[content];
$data[datetime] = date(’Y-m-d H:i:s’);
$data[pid] = 1;
return $data;
}
?>
这样一个最最简单的文章的发布系统就完成了,不知道对您有什么收获没有。
九、总结
程序写完了,大家来总结一下吧,看看实现过程,应该可以说是简单明了吧。
1、统一实现数据库访问接口。更改后台数据库结构的时候,只要简单的修改相应的接口函数,其他部分的php代码根本就不用理会。
2、整个系统php代码和html代码分开管理,php代码前台实现起来也很简单,你也应该已经可以发现了,基本上是在10行代码左右。
3、可以任意的扩充功能。用函数对新的功能进行包装后,在具体的前台的查询显示页面中只有加入对相应的函数的简单的调用就可以了,一行代码就搞定了。
4、代码复用。通过对功能的包装,减少了大量的不必要的重复代码工作,效率应该是提高了很多吧?
5、可以移植性。如果将来做其他的网站,要是遇到了和这个项目相同的实现功能,你可以怎么做呢?把这里的函数和数据库结构copy过去,修改一下新项目的模板,是不是就可一完成这个新的项目了呢?根本就不用考虑修改php代码。
6、结构代码清晰。别人可以轻易的和你共同开发一个项目,代码冲突也会减少至最低。
当然实际工作中遇到的情况可能比这个例子复杂的多,但是再复杂的任务都是可以拆分的。
十、后言
不知道大家有没有学过jsp和servlet这样的东西,他们有很多优秀的设计思路,值得我们去研究和copy(说句实在话,有时间的都应该去接触一下java,不是为了学习这门语言而学习,是要学习他的设计模式和优秀的功能实现方式)。jsp至少有两样东西对我们很有用,action和filter。
action是主要是处理一些事件逻辑,就像add.php中我们定义的action()函数一样,用来验证和获取表单提交上来的数据。当然这样写的代码量和你以前方法的代码量是一样的,好像没有什么区别,但是它实现了代码的分离,结构是不是比你以前的方法清晰很多呢?
filter是一个过滤功能,用来过滤和重新定向网络的访问,对一些非法的请求和错误的请求进行重新的定向。让我们来通过一个后台管理的程序来看看他具体的作用。
将下面的这个函数copy到你的CoreUtil.php里面,这个函数是一个后台管理登陆的过滤函数,一个是不在本地缓存web页面的函数:
function windowNoCache($cache){
if(!$cache || headers_sent()) return ;
header(’Expires: ’.date(’D,d M Y H:i:s’,mktime(0,0,0,1,1,2000)).’ GMT’);
header(’Last-Modified:’.gmdate(’D,d M Y H:i:s’).’ GMT’);
header(’Cache-control: private, no-cache,must-revalidate’);
header(’Pragma: no-cache’);
}
function isAdminLogin(){
if($_SESSION[relogin]=="ok") return;
if($_SESSION[adminuser]!=SYS_ADMIN_NAME){
$_SESSION[relogin] = "ok";
die("<script language=\"javascript\"> top.location=’adminlogin.php’; </script>");
}
$_SESSION[relogin] = "no";
}
然后在 根目录 底下加上如下的文件
------------adminconfig.inc.php------------
<?php
define(’SYS_ADMIN_NAME’, ’hello’); //后台管理登陆名
define(’SYS_ADMIN_PASSWORD’, ’hello’); //后台管理登陆密码
include ’config.inc.php’;
windowNoCache(true);
isAdminLogin();
?>
------------adminindex.php----------------
<?php
require_once "adminconfig.inc.php";
renderTpl(’adminindex.htm’, array());
?>
------------adminlogin.php------------------
<?php
include "adminconfig.inc.php";
if($_POST[name]==SYS_ADMIN_NAME && $_POST[code]==SYS_ADMIN_PASSWORD){
$_SESSION[adminuser] = SYS_ADMIN_NAME;
header("location: adminindex.php");
}else{
renderTpl(’adminlogin.htm’, array());
}
?>
在 smart/template 目录下面加上如下的文件
------------adminlogin.htm------------------
<form name="form1" method="post" action="">
<input type="text" name="name" size="20" value="">
<input type="password" name="code" size="20" value="">
<input type="submit" name="Submit" value=" 登 陆 ">
</form>
------------adminindex.htm----------------
<h2>您好欢迎登陆后台管理</h2>
现在访问adminindex.php看看会发生什么事情,然后用adminconfig.inc.php里面设定的用户名密码登陆。这种功能在web的很多地方都可以派上用场,应该是一个好的方法吧。其他的后台访问的页面只要也都加载了adminconfig.inc.php ,就不用再考虑后台访问权限的问题了。
十一 附录
简单的隐藏文件的扩展名,搞晕浏览者,让他不知道你是用什么语言编的程序。
就以list1.php为例子吧,
1、我们修改list1.php的名称为list1.tmp
2、进入命令行窗口(dos窗口),在web的目录下面建立一个文件,文件名是“.htaccess”。
3、编辑“.htaccess”文件,输入以下的内容
AddType application/x-httpd-php .tmp
通过浏览器访问list1.tmp,看看是不是ok了。
相关文章
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5 中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。2009-09-09
最新评论