老尸 发表于 2015-2-4 00:10:19

PHP教程之一种PHP设计形式:DPT

也或许是因为我还没有真正的学到深处吧,说实在的,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));//网站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)) {
   exit('Not commit parameter');
}
echo "Error Message: ". $get;
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.title|escape:"html"|truncate:30:"...":true}</a> |
工夫:{$topic.addtime|date_format:"%Y年%m月%d日"} |
作者:{$topic.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
   * @accessprivate
   */
    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 的个人履历,以及统计网页流量。

变相怪杰 发表于 2015-2-4 09:46:04

这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。

金色的骷髅 发表于 2015-2-6 03:07:56

php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)

飘灵儿 发表于 2015-2-7 01:00:41

使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。

冷月葬花魂 发表于 2015-2-19 04:55:53

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

透明 发表于 2015-3-6 08:38:45

装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。

小妖女 发表于 2015-3-7 06:59:29

环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。

第二个灵魂 发表于 2015-3-14 13:18:56

再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。

只想知道 发表于 2015-3-21 08:47:24

写的比较杂,因为我也是个新手,不当至于大家多多指正。

莫相离 发表于 2015-3-30 10:56:29

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

爱飞 发表于 2015-4-1 22:58:43

刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。

因胸联盟 发表于 2015-4-6 06:26:57

没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。

谁可相欹 发表于 2015-4-8 06:52:05

个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。

乐观 发表于 2015-4-26 20:52:17

使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。

仓酷云 发表于 2015-5-10 19:14:07

,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。

活着的死人 发表于 2015-5-12 13:28:29

这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己

柔情似水 发表于 2015-6-10 18:30:03

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

若天明 发表于 2015-6-26 20:45:04

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

不帅 发表于 2015-7-1 13:34:01

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

兰色精灵 发表于 2015-7-13 20:30:25

写的比较杂,因为我也是个新手,不当至于大家多多指正。
页: [1] 2
查看完整版本: PHP教程之一种PHP设计形式:DPT