|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也或许是因为我还没有真正的学到深处吧,说实在的,PHP中的很多高级点的应用,如PHP类、PHP函数基本还是不懂吧!设计 PHP为何在主流的使用中老是那末不精彩,老是不如.Net/Java,就是由于在PHP处置大型使用的时分,那些不完全的面向对象机制、数据库处置的单一,欠亨用性等等,影响了PHP做大型使用。
* 作者:heiyeluren
* 工夫:2005-8-29
* 接洽:heiyeluren_at_gmail.com
1、DPT引见
PHP为何在主流的使用中老是那末不精彩,老是不如.Net/Java,就是由于在PHP处置大型使用的时分,那些不完全的面向对象机制、数据库处置的单一,欠亨用性等等,影响了PHP做大型使用。那末,若何来改动这个情况呢?固然就是需求引进一些新的设计办法,把PHP中不健全的面向对象机制完全起来,停止更好的PHP大中型使用的开辟。
从Java过去的MVC形式十分盛行,并且已有局部已引申进了PHP范畴,设计形式的引进,就是为了更好的掌握项目开辟。明天我要说一种设计形式,相似于MVC,它叫DPT形式。其实有时分我也感觉有点象Java外面的DAO(Data Access Object),不外DAO是夹在营业逻辑层和数据库资本层之间的,而DPT更多的是把营业逻辑也封装在类里,和DAO层在不异的内容中。
D - Data,数据搜集层
P - Php,PHP数据挪用层
T - Template,模板层
起首,咱们要对它停止复杂的懂得。
Data,就是咱们的数据层,它不是数据库笼统类,而是经由过程数据库接口,履行一些SQL,把数据获得的进程,普通把这类操作封装在类外面,就构成了咱们的数据搜集层。
Php,就是对咱们搜集的数据停止收拾整顿,计划,同时解析模板停止数据的显示。
Template,模板层,就是咱们的HTML页,外面不包括任何PHP代码,只要模板标签的内容,经由过程它来掌握数据在页面中有格局的显示。
咱们这里三层中,每层都是勉励由一团体来开辟,然后经由过程PHPDoc之类的东西,把源代码中的API生成文档,由P层的人停止挪用。
那末,在实践的项目开辟中,它是怎样运作的呢,咱们又若何把这类设计形式引进咱们的项目中呢?
咱们上面将应用一个实践的项目来说解DPT形式。浏览一下内容必需具有根基的PHP4的面向对象编程、数据库笼统类、模板等常识。
咱们今朝为了减速PHP的开辟,都利用PHP封装了局部功效,好比数据库操作笼统类,模板类等等,这些都是为了开辟庞杂使用而应运而生的。今朝对照主流的数据库笼统类有phplib db、PEAR::DB、ADODB等等,模板处置类有phplib template、smartTemplate、Smarty等等。本文中都是利用PHP Group保举的产物,数据口笼统类利用PEAR::DB,模板处置类利用Smarty,假如对这两个类库不熟习的读者,请参考文章前面的链接。
2、项目系统布局
上面咱们来构建咱们基于DPT形式的PHP使用。(以下局部内容参考《MVC形式、类封装仍是黑客代码》)
文件目次布局(只触及到关头的目次)
class 类库,包括一切的数据搜集层
template 模板文件寄存目次
include 经常使用库,包含PEAR、Smarty等类库,同时还有本人界说的根基函数
config.inc.php 根基设置装备摆设文件,包含数据库设置装备摆设,其他根基信息设置装备摆设
security.inc.php 平安处置页,次要多传递的变量停止处置
init.inc.php
error.php 毛病处置页
class目次中寄存了咱们数据搜集层中的内容,普通的建议是每一个类文件只是针对一个表停止操作,好比cmsMessage.class.php,那末这个类就是属于功效CMS外面的,只担任操作Message这个表。一切的数据库交互和操作都是封装在类里的,在P层不答应呈现任何直接操作数据库的语句。
template目次中寄存了咱们的网页模板,模板中都是利用Smarty标签停止分列的,同时,在模板中,都是建议利用JS+CSS来掌握页面,模板中只要DIV标签来复杂的排版,如许,十分利于网站改版和改换皮肤。
include目次就是对经常使用文件的包括,好比PEAR::DB类、Smarty类库文件等。config.inc.php就是根基的设置装备摆设文件,包含数据库、根基常量等等,security.inc.php是平安处置页,咱们这里次要是做一个变量的平安反省,上面内容咱们将细心引见。init.inc.php是一个初始化操作的页面,包含初始化数据库链接,实例化模板处置类等等操作,error.php是毛病信息处置页,一切的毛病信息经由过程URL编码后转到该页。
3、项目根基设置装备摆设代码
关头页代码实例:
/**
* config.inc.php
* 设置装备摆设文件
*/
/* 数据库设置装备摆设 */
define('DB_HOST', 'localhost'); //数据库主机
define('DB_USER', 'root'); //数据库链接用户
define('DB_PASS', ''); //毗连暗码
define('DB_NAME', 'cms'); //默许数据库
define('DB_PORT', '3306'); //数据库端口
define('DB_TYPE', 'mysql'); //数据库类型
define('DB_OPT', '1'); //是不是临时链接
/* 模板信息设置装备摆设 */
define('TPL_TEMPLATE_DIR', './template/'); //模板目次
define('TPL_COMPILE_DIR', './template/templates_c/'); //模板编译目次
define('TPL_CONFIGS_DIR', './template/configs/'); //模板设置装备摆设文件目次
define('TPL_CACHE_DIR', './template/cache/'); //模板缓存目次
define('TPL_LIFTTIME', '1'); //缓存工夫
define('TPL_CACHEING', 'true'); //是不是缓存
define('TPL_LEFT_DELIMITER', '{'); //右边界符
define('TPL_RIGHT_DELIMITER', '}'); //右侧界符
/* 网站途径设置装备摆设 */
define('ROOT_PATH', dirname(__FILE__)); //网站地点根目次
define('URL_PATH', dirname($_SERVER[PHP_SELF])); //网站URL地址途径
define('DB_PATH', ROOT_PATH.'/include/db'); //PEAR::DB目次
define('TPL_PATH', ROOT_PATH.'/include/smarty'); //Smarty目次
/**
* security.inc.php
* 平安过滤文件
*/
/* 过滤划定规矩 */
$arr_filtrate = array("'", '"', "\");
/* 过滤函数 */
function var_filtrate($var)
{
global $arr_filtrate;
foreach ($arr_filtrate as $value)
{
if (eregi($var, $value)) {
return true;
}
return false;
}
}
/* 获得分歧版本下的GET和POST数组 */
if (phpversion() < '4.1.0') {
$get = &$HTTP_GET_VARS;
$post = &$HTTP_POST_VARS;
} else {
$get = &$_GET;
$post = &$_POST;
}
/* 反省GET变量 */
if (count($get)) {
foreach ($post as $get_var) {
if (var_filtrate($get_var)) {
exit('Commit get parameter falsity');
}
}
}
/* 反省POST变量 */
if (count($post)) {
foreach ($post as $post_var) {
if (var_filtrate($post_var)) {
exit('Commit post parameter falsity');
}
}
}
其实,以上过滤的办法也不是最好的,建议参考我的另两篇防注入文章获得更好的办法,链接参考附录。
/**
* error.php
* 毛病处置页面
*/
if (!isset($get[msg])) {
exit('Not commit parameter');
}
echo "Error Message: ". $get[msg];
echo "<p><a href='javascript:history.back()'>前往上一页</a>";
就是一些毛病处置的感化,普通出的GET体例传递过去的动静都是经由urlencode()过的字符。
/*
* init.inc.php
* 初始化法式
*/
require_once(dirname(__FILE__).'config.inc.php');
require_once(ROOT_PATH.'security.inc.php');
require_once(DB_PATH.'DB.php');
require_once(TPL_PATH.'Smarty.class.php');
/* 初始化数据库链接 */
$db = DB::connect("DB_TYPE://DB_USER@DB_PASS:DB_HOST/DB_NAME", DB_OPT);
if (DB::isErro($db)) {
return $dg->getMessage();
}
$tpl = &new Smarty();
/* 初始化模板 */
$tpl->templates_dir = TPL_TEMPLATE_DIR;
$tpl->compile_dir = TPL_COMPILE_DIR;
$tpl->cache_dir = TPL_CACHE_DIR;
$tpl->configs = TPL_CONFIGS_DIR;
$tpl->lifetime = TPL_LIFTTIME;
$tpl->caching = TPL_CACHEING;
$tpl->left_delimiter = TPL_LEFT_DELIMITER;
$tpl->right_delimiter = TPL_RIGHT_DELIMITER;
根基文件描写终了。代码写了很多,只是为了更好的了解这个形式。
4、框架实践开辟
申明:
咱们以下项目代码都是以cms数据库中topic表做例子,代码只是为了演示框架布局,没有对代码停止测试,不包管可以正常运转。
topic的表布局:
CREATE TABLE `topic` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`addtime` int(11) default NULL,
`author` varchar(50) default NULL,
`type` int(11) default NULL,
`option` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`)
);
(一)Data层:数据收集层
Data层次要就是针对数据库的一切操作都封装起来,然后经由过程接口的模式供应给Php层停止挪用,同时在Data层里也封装了一些原始的数据库操作(相似于Java中的DAO)。普通Data层都是类的模式,保留在咱们下面的 /class目次下,普通的原则是一个类文件操作一个数据表,就是说不论详细的营业逻辑若何,一切的数据表操作都是封装在一个类文件里的。好比说咱们有一个数据表叫做topic,那末咱们对应操作的类文件就是:topic.class.php。其实这里是可以做扩大的,好比说,咱们的项目十分复杂,有良多内容,好比包含有CMS、Blog、BBS等等,那末咱们就必需给每个栏目分派一个数据库,那末针对以后操作数据库的话,就利用类中封装的链接办法停止链接,就能够丢弃咱们下面init.inc.php中初始化的操作,而操作在类外面停止的链接。
假定咱们今朝操作的栏目是CMS体系,数据库名叫做cms,那末咱们上面机关一个操作cms数据库外面的topic表的类来。
/**
* cms_topic.class.php
* 文章处置类
*/
class cmsTopic
{
var cmsDBName; //数据库名
var cTableName; //以后操作的表名
var cDsn; //数据链接源
var cDebug; //是不是翻开调试,1为是,0为否
var cDbPointer //链接资本
var cfetchMode //获得数据库材料的体例
var cEncode //数据库中数据保留的编码格局,默许是UTF-8
/* 机关函数 */
function cmsTopic()
{
//设置装备摆设信息从config.inc.php中设置
$this->cfetchMode = DB_FETCHMODE_DEFAULT;
$this->cTableName = "topic";
$this->cDsn = "mysql://".
DB_USER.":".
DB_PASS."@".
DB_HOST."/".
DB_NAME;
$this->cEncode = "utf8";
}
/* 链接数据库 */
function connectDatabase()
{
if (!is_object($cDbPointer))
{
$this->cDbPointer = DB::connect($this->cDsn);
if ($this->cEncode=="utf8") {
$this->cDbPointer->query("set names 'utf8'");
}
$this->cDbPointer->setFetchMode($this->cfetchMode);
if (DB::isError($this->cDbPointer)) {
return false;
}
return $this->cDbPointer;
}
}
/* 封闭数据库毗连 */
function closeDatabase()
{
if (is_object($this->cDbPointer)) {
$this->cDbPointer->disconnect();
}
}
/*--------------- 数据库根基操作 --------------*/
/* 拔出操作 */
function insert($arr)
{
if(!is_array($arr) || count($arr) == 0){
return false;
}
if("" == $this->cTableName) return false;
$db = $this->connectDatabase();
$res = $db->autoExecute($this->cTableName,$arr,DB_AUTOQUERY_INSERT);
if(DB::isError($res)){
return $res;
}else{
$insertId = ($db->getOne("select LAST_INSERT_ID();"));
if($insertId>0) {
return $insertId;
} else {
return true;
}
}
}
/* 更新操作 */
function update($id,$arr)
{
if("" != $id && !(is_array($arr))){
return false;
}
$db = $this->connectDatabase();
$res = $db->autoExecute($this->cTableName,$arr,DB_AUTOQUERY_UPDATE,"id = '$id'");
if(DB::isError($res)){
return false;
}else{
return true;
}
}
/* 删除操作 */
function delete($id)
{
$db = $this->connectDatabase();
$res = $db->query("DELETE FROM ".$this->cTableName." WHERE id = '$id'");
if(DB::isError($res)){
return false;
}else{
return true;
}
}
}
下面的代码一个很根基的针对一个表操作的类雏形已描写出来了,包含毗连数据库,根基的数据库原始操作都有了。你一定会问,为何没有把select的操作封装出来?次要是由于select是SQL里最庞杂的操作,不成能写那末通用的一个办法去操作它,所以好不如不写,自在发扬。
那末咱们需求加上一些根基的功效呢?好比读取内容、新增添一篇文章等操作,那末咱们还必需在类外面添加一些办法,好比咱们增添提取一篇文章内容、提取指准时间的文章、提取指定种别的文章、统计今朝一切文章的总数等操作。
/**
* cms_topic.class.php
* 文章类加强
*/
class cmsTopic
{
// ...下面已描写的办法省略
/**
* 函数: getTopicContentById()
* 功效: 获得指定ID的文章的内容
* 参数: $id 指定要获得的ID
* $cols 要提取的字段值
* 前往: 胜利前往数据集数组,掉败前往毛病信息
*/
function getTopicContentById($id, $cols="*")
{
$db = $this->connectDatabase($this->cDsn);
$sql = "SELECT $cols FROM ". $this->cTableName ." WHERE id = '$id'";
$result = $db->getAll($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
/**
* 函数: getTopicBySpecifyTime()
* 功效: 获得指准时间的文章的列表
* 参数: $startTime 指定入手下手工夫
* $endTime 停止工夫
* $cols 要提取的字段值
* 前往: 胜利前往数据集数组,掉败前往毛病信息
*/
function getTopicBySpecifyTime($startTime=0, $endTime=0, $cols="*")
{
$db = $this->connectDatabase($this->cDsn);
$start = ($startTime == 0) ? "" : "WHERE addtime > $startTime";
$end = ($endTime == 0) ? "" : "AND addtime < $startTime";
$sql = "SELECT $cols FROM ". $this->cTableName ." ".$start ." ".$end;
$result = $db->getAll($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
/**
* 函数: getTopicByType()
* 功效: 获得指定种别的文章的列表
* 参数: $type 指定的类型
* $cols 要提取的字段值
* 前往: 胜利前往数据集数组,掉败前往毛病信息
*/
function getTopicByType($type, $cols="*")
{
$db = $this->connectDatabase($this->cDsn);
$sql = "SELECT $cols FROM ". $this->cTableName ." WHERE type = '$type'";
$result = $db->getAll($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
/**
* 函数: getTopicSum()
* 功效: 获得一切文章总数,假如指定种别,则获得指定种别总数
* 参数: $type 指定的类型
* 前往: 胜利前往获得的总数,掉败前往毛病信息
*/
function getTopicSum($type="")
{
$db = $this->connectDatabase($this->cDsn);
$typeStr = ($type == "") ? "" : " WHERE type = '$type'";
$sql = "SELECT count(id) FROM ". $this->cTableName ." ".$typeStr;
$result = $db->getOne($sql);
if (DB::isError($result)) {
return $result->getMessage();
} else {
$db->disconnect();
return $result;
}
}
}
下面咱们机关了一些数据提取类,这应当就是咱们Data层的中心了。写办法的时分要尽可能思索到扩大性,好比对列的提取,好比一个办法合适多种情形,好比排序等等,思索的越多,今后保护起来就对照轻易,固然,我保举的办法是一个办法尽可能就做一件工作,假如一个函数要做多个工作,那末就写成多个函数,如许便于代码重用和保护性,我团体以为一个办法最用不要超越100行。
假如函数中有触及到数据库的操作,必定记得开头的时分把数据封闭失落,否则很轻易把办事器资本占用光。固然,你也能够在PHP层去封闭毗连。好比,你需求良多次挪用统一个办法,那末这个办法假如重复的毗连数据库又封闭数据库,也很华侈资本,并且速度慢,这个时分就能够把封闭数据库的操作在Php层停止封闭,你可以先机关好一个办法来停止,好比咱们下面的 closeDatabase() 办法。
(二)Php层:数据挪用层
PHP层次要就是把从Data层搜集的数据再这一层停止挪用。由于咱们根基的准绳就是把一切跟数据库的操作都封装在Data层里,在其他层都不触及就任何的直接对数据库的操作,如许可以停止优秀的封装,如许有点相似于 JSP和Javabean,Javabean的类担任和数据库交互,JSP担任挪用Javabean来输入数据。咱们这里的PHP层就相当于JSP层,后面的Data层就相当于Javabean层,如许玻璃他们之间的耦合度,可以便利法式往后的保护。
咱们这里的PHP层次要就是庞杂从数据库种提取数据,完成一些复杂的逻辑,然后把数据输入到Template(模板层)。如今咱们使用示例代码来看看PHP层是若何挪用Data层的数据的。
/**
* topic_list.php
* 文章列表法式
*/
/* 包括根基文件 */
require_once("init.inc.php");
require_once("class/cms_topic.class.php");
//实例化Data层对象
$topic = new cmsTopic();
//获得文章类型变量
$topicType = intval(get("type"));
//从Data层中把数据提取过去
$topicList = getTopicByType($topicType);
//给模板变量赋值后输入页
$tpl->assign("topic", $topicList);
$tpl->assign("topic.html");
代码是否是很复杂?就是把数据获得过去,然后解析到模板层中去向理,所以如许假如今后呈现成绩改起来对照轻易,好比是数据获得的成绩,那末直接改下面的类文件就行,假如是模板显示的成绩,那末直接修正模板层中的对应的模板页就能够,十分便于保护。
(三)Template层:模板层
这个模板层就是咱们常说的网页了,不外这里就是包括了一些Smarty的模板变量和HTML混和,模板页处置的时分就对页面中的模板变量停止交换,最初咱们看到的了局就是模板页和PHP层中的法式输入混和的了局。
普通模板页设计的时分,最好遵守Web尺度,就是说尽可能在页面中不利用表格等html标签来掌握页面,而是利用div层来寄存数据,利用css款式表来掌握页面结构,如许对包含JavaScript剧本的编写,今后页面的改版等等十分有优点。并且假如要还模板也很复杂,只需求把css文件交换就能够到达后果。固然,假如对web尺度不懂得,那末建议去浏览一下《网站重构》这本书。
咱们上面就复杂的描写一下Template(模板层)的代码是若何的。
{* 加载头部文件 *}
{include file="header.html"}
{* 模板主体 *}
<div>
{* 右边导航条 *}
</div>
<div>
<h3>文章列表</h3>
{section name=topicList loop=$topic}
题目:<a href="">{$topic[topicList].title|escape:"html"|truncate:30:"...":true}</a> |
工夫:{$topic[topicList].addtime|date_format:"%Y年%m月%d日"} |
作者:{$topic[topicList].author|escape:"html"}<br />
{sectionelse}
临时没有任何文章
{/section}
</div>
{* 加载底部文件 *}
{include file="foot.html"}
模板页中大致能够有一些JavaScript法式,或有款式文件,普通利用款式文件来掌握页面的结构和显示后果。咱们这里没有具体的描写,在实践项目中可以由网页制造人员去担任。
5、利用DPT形式的项目计划
普通在一切的软件项目或是网站项目中,要包管一个项目可以顺遂完全的完成,那末便需求手艺主管或架构师优秀的设计和办理。普通一切项目中人是最难掌握的要素,你可以把项目指定的十分完美,架构可以选择的十分公道,然而你不克不及掌握人的要素,不克不及包管项目标中的某个成员能够在任什么时候候分开项目。当在PHP项目中,假如一个项目脚色溘然的离去,能够招致项目要停留,要从头找人来代替,影响了项目标进度,那末若何无效的掌握息争决这些成绩。
在一个利用DPT设计形式的项目中,项目中个个脚色分离有网页设计师、网页制造人员、客户端剧本JavaScript法式员、办事器端PHP法式员。他们的分工都是甚么呢?网页设计师担任设计网页的界面,生成后果图,然后由网页制造人员去做成网页,固然,假如是遵守Web尺度的项目标话,那末网页制造人员次要的义务就是担任页面结构款式的编写。客户端法式员次要是担任客户端剧本的编写,好比针对页面中需求利用的JavaScript停止编写,PHP法式员次要是担任咱们下面Data & PHP & Template 三层的代码编写,固然,假如项目足够复杂,完整可以拆分出来,有PHP法式员担任Data层,有PHP法式员担任Php和Template层,分工明晰,Php层法式员只是需求挪用Data层法式员已写好的类库停止挪用,不必关怀类是若何完成的。
如许一个项目架构上去,可以依照义务需求来布置某个模块的人的数目,最大限制的把项目计划好。固然,项目中一些需要的要素是要思索的,好比,若何让网页制造人员、客户端剧本法式员和PHP法式员优秀的协作,那末就是分别他们的义务,好比,模板页必需由PHP法式员来编写,然后提交给JavaScript法式员制造客户端剧本,最初再由网页制造人员经由过程CSS来掌握结构,那末Php法式员在模板页中就必需利用div等标签来界说一个块的数据,假如任何一块出了成绩,那末对应找响应义务人,就可以够很好的防止彼此推脱义务,或权责不分的情形,如许有益于办理,也有益于每一个开辟成员之间的优秀协作。
为了避免项目掉控,或不会由于项目成员的分开而影响项目标进度和办理,必需有响应的办法和划定规矩。咱们次要针对PHP法式员来停止描写,局部办法一样合用于网页制造人员和客户端剧本法式员。
(1)编码标准
项目开辟中为了便于保护和今后其别人接办代码,必需一致编码标准,包含对目次、文件名、类、函数、变量、正文等等都必需遵守尺度,并且为了代码的保护,必需请求PHP法式员编写正文。今朝根基遵守的是Fredrik Kristiansen写的《PHP 编码标准》,或是PEAR中代码的标准。
假如代码为了做成接口,或需求做成参考的文档便利今后保护代码,利用phpDoc等东西,那末为了可以利用PEAR包中的phpDoc可以正知识别,所以普通建议遵守PEAR包的标准,次要是DPT形式中Data层中类的的编码必需标准。
PEAR中pear.php中基类的局部代码:
class PEAR
{
/* 属性的描写 */
// {{{ properties
/**
* Whether to enable internal debug messages.
*
* @var bool
* @access private
*/
var $_debug = false;
//其他属性省略...
// }}}
/* 对办法的描写 */
// {{{ constructor
/**
* Constructor. Registers this object in
* $_PEAR_destructor_object_list for destructor emulation if a
* destructor object exists.
*
* @param string $error_class (optional) which class to use for
* error objects, defaults to PEAR_Error.
* @access public
* @return void
*/
function PEAR($error_class = null)
{
//办法外部代码省略...
}
// }}}
}
关于下面外部标签的注释请参考文章开头链接中的《php Documentor 1.2.2 利用申明标准》
(2)单位测试
单位测试是对法式停止的第一步测试,而且是法式员本人做的测试,没有谁比本人更懂得本人写的代码,所以单位测试对包管法式的不乱性尤其主要。所以普通项目中,出格是写类库的法式员,必定要对本人写的代码停止单位测试,只需包管数据可以不乱的获得,才干包管Php层的法式员可以准确的获得数据。针对PHP的单位测试东西今朝有SimpleTest和PEAR包中的phpUnit/phpUnit2,phpUnit2是针对PHP 5的测试东西,这个可以依照项目标实践情形来决意利用甚么测试东西。SimpleTest和phpUnit的利用参考文章请参考文章最初的链接。
(3)法式平安
在明天这个黑客横行,SQL Injection众多的时分,为了包管法式可以准确完全的运转,那末就必需请求法式员对本人的法式停止平安的编码。
次要是两方面,一方面是办事器真个平安,次要就是要过滤用户提交的变量,记得收集下流行的一句话:“不要信任用户提交的任何数据”,由于你不克不及包管这个用户是歹意的仍是好心,是通俗用户仍是黑客,所以不论是谁,必定要过滤失落它的变量,不外是经由过程GET体例仍是POST体例过去的数据,一切过滤。次要是过滤一些特别自若,好比/"'等等,包管办事器和数据的平安。
另外一方面就是针对客户真个威逼,好比提交一些歹意的JavaScript代码,当通俗用户检查该页的时分,那末将给对方带来影响或危险,那末会极大的影响网站或软件的名誉,这是要防止的。一样的,这个也是要优秀的过滤变量,假如没法在用户提交数据的时分过滤,那末就在显示输入的时分停止过滤,次要是过滤一些HTML标签和JavaScript代码,包管客户阅读的平安。
关于一些根基的平安成绩可以参考文章前面的链接。
(4)代码同步(版本办理)
但一个项目是多人开辟的时分,那末代码同步或说是版本办理就尤其主要,由于为了包管每一个开辟成员的代码都是最新的,最不乱的,那末必需要利用CVS等版本办理东西,固然,你想利用VSS也无可厚非。普通建议是专门利用一台办事器来供一切开辟人员开辟,不建议把代码保留在开辟人员的当地上,由于大局部人都是利用Windows等操作体系,假如产生病毒传染、装备破坏或其他要素,那末代码将壮烈就义,如许形成又要反复开辟的华侈,假如把代码直接寄存在办事器上,普通办事器装置都是Unix/Linux体系,可以根基包管代码的平安和完全。
CVS的装置利用文章可以参考文章最初的链接。
(5)多模块通讯
假如项目足够复杂,门户级的使用,那末一定触及到多栏目/模块之间的通讯
6、停止语
DPT形式或许在良多项目中你已使用了,只是没有认证的停止界说,假如浏览本文可以取得同感,或豁然开朗甚至垂手顿足,那末我想本文就给了你必定匡助,这就足够了。
写作文章前前后后花了快一个月,只是一向太怠惰,怕的写的欠好,怕这个器材出来没成心义。。。然而不论若何,仍是写出来了。
假如能够,测验考试思索把你的PHP使用移植到PHP5上,或许,那才是你需求的。
Writer by heiyeluren <heiyeluren_AT_gmail.com>
2005年8月29日 下战书 17:38
>>>>>> 附录:(文章响应链接)<<<<<<
PEAR http://pear.php.net
Smarty http://smarty.php.net
phpUnit http://phpunit.sourceforge.net
SimpleTest http://simpletest.sourceforge.net | http://www.lastcraft.com/simple_test.php
phpDocumentor http://www.phpdoc.org
《PEAR:创立两头的数据库使用层》 http://www-128.ibm.com/developerworks/cn/linux/sdk/php/pear4/index.html
《模板引擎SMARTY》 http://www-128.ibm.com/developerworks/cn/linux/l-smart/index.html
《MVC形式、类封装仍是黑客代码》 http://www-128.ibm.com/developerworks/cn/linux/sdk/php/php_design/index.html
《PHP中的代码平安和SQL Injection提防》 http://blog.csdn.net/heiyeshuwu/archive/2005/06/14/394225.aspx
《在PHP中利用SimpleTest停止单位测试》 http://www.hsboy.com/blog/archives/90-PHPOESimpleTesta.html
《用phpUnit帮你调试php法式》 http://www.ccw.com.cn/htm/app/aprog/01_4_13_4.asp
《php Documentor 1.2.2 利用申明标准》 http://www.phpx.com/happy/top98827.php
《PEAR:利用PHPDoc轻松创立你的PEAR文档》 http://www-128.ibm.com/developerworks/cn/linux/sdk/php/pear3/index.html
《PHP 编码标准》 http://www.phpe.net/html/php_coding_standard_cn.html
《CVS利用手册》 http://www.chedong.com/tech/cvs_card.html
工具程序用来显示 Rasmus Lerdorf 的个人履历,以及统计网页流量。 |
|