??xml version="1.0" encoding="utf-8" standalone="yes"?>
<head>
<title>
</title>
<body>
<form name="Form1">
<input name="allbox" type="checkbox" onClick="TA();" title="选中或清除选中所有的目" tabindex="105">选中或清除选中所有的目
<br/>
<span class="X">
<input type="checkbox" name="ABC" class="A" onClick="TTA(this);">清明时节</span>
<br/>
<span class="X">
<input type="checkbox" name="DEF" class="A" onClick="TTA(this);">长江水啊</span>
<br/>
<span class="X">
<input type="checkbox" name="GHL" class="A" onClick="TTA(this);">嘿嘿试</span>
<br/>
</form>
<script language="javascript">
var frm = document.Form1;
</script>
<script language="JavaScript">
function TA(isO,noHL){
var trk = 0;
for(var i=0;i<frm.elements.length;i++){
var e=frm.elements[i];
if((e.name !='allbox') && (e.type == 'checkbox')){
e.checked = frm.allbox.checked;
if (frm.allbox.checked){
//e.parentElement.className = "H"; //.parentElement不兼容firefox览器?br /> e.parentNode.className = "H";//调用讄父节点元素class改变背景?br />
}else{
e.parentNode.className = "X";//调用讄父节点元素class改变背景?br /> }
}
}
}
function TTA(CB,noHL){
if (CB.checked){
CB.parentNode.className = "H";
}else{
CB.parentNode.className = "X";
}
var TB=TO=0;
for (var i=0;i<frm.elements.length;i++){
var e=frm.elements[i];
if ((e.name != 'allbox') && (e.type=='checkbox')){
TB++;
if (e.checked)
TO++;
}
}
frm.allbox.checked=(TO==TB)?true:false;
//如果不是所有项被选中则allbox讑֮未被选中
}
</script>
<style>
.H{
background: #ADD8E6
}
.X{
background: #FFFFFF
}
</style>
</body></html>
input, select {
font-size: 14px;
color: #333333;
padding-left:3px;
background:#f6f6f6;
border: #CCCCCC 1px solid;}
</style>
<?php
require_once dirname(__FILE__) ."/headers.php";
$i = 0;
function category($category_parent_timestamp){
global $db;
global $i;
$result = $db->get("{category_parent_timestamp} == " . $category_parent_timestamp,null,"categories",false,"category_time","desc");
sort($result);
for($index=0;$index<count($result);$index++){
echo "<option>";
for($x=0;$x<$i;$x++){
echo "--";
}
echo $result[$index]['category_title'];
echo " ";
$sub = $db->get("{category_parent_timestamp} == " .$result[$index]['category_timestamp'],null,"categories",false,"category_time","desc");
if(count($sub)!=0){
$i++;
category($result[$index]['category_timestamp']);//q代
$i--;
}
echo "</option>";
}
}
echo "<select>";
category("0");
echo"</select>";
?>
国h开发的一个小型文本数据库pȝ?/p>
http://blog.csdn.net/hahawen/archive/2004/09/13/102557.aspx
/*************************/
/* author:大龄青年
/* email :wenadmin@sina.com
/* from: http://blog.csdn.net/hahawen
/*************************/
原代码下? http://club.phpe.net/index.php?s=&act=Attach&type=post&id=29432
Q近来帮许多|友改程序,发现一个问题,是大家用php开发设计模式的非常的乱,所以写下这文章,希望对大安有帮助)
php作ؓ“最单”的Web脚本语言, 在国内的市场来大Qphper来多Q但是感觉大多数人好像没有考虑到模式问题,什么样的设计模式才是最优的Q才是最适合自己目前工作的,毕竟效率是最重要的(用省下的旉打游戏,多美?..Q。MVC应该是首选,www.sourceforge.net 上有好多优秀的基于MVC的开源项目,大家可以冲过ȝI研I?/P>
前几天给自己公司|站改版Q主要还是文章发布系l,老板说后台我x么设计怎么设计Q唯一的前提就是快。于是自己搭Z一个简单的发布pȝ的框架。如果单U从文章发布pȝ上讲Q基本上可以满“中型”企业网站的文章发布pȝ的要求,后台的d的php代码不超q?00行,而且支持L扩充和plugin功能?/P>
废话不再说了Q下面把我的架构讲一下,希望Ҏ能有所帮助?/P>
注意Q在开始前Q需要您下蝲一个模板处理工LQ“smarttemplate”,q了解一些模板的单的使用?/P>
我的试环境Qwindows2k/apache2/php4.3.2/smarttemplatecd
先讲一下整个web站点的文件的分布Q在后面的章节中陆l创建ƈ填充下面的目录和文g
我的服务器的web的根目录?“C:/Apache2/htdocs/?BR>我在下面建立了一个文件夹“cmstest”作为我的网站的L件夹
文g夹“cmstest”下面的子文件结构是Q?/P>
/config.inc.php
/list1.php
/list2.php
/new.php
/add.php
/view.php
/page.js
/src/MysqlUtil.php
/src/ArticleUtil.php
/src/CoreUtil.php
/src/ParseTpl.php
/src/lib/smarttemplate/*.* q个目录用来存放smarttemplate的类库的
/smart/template/list1.htm
/smart/template/list2.htm
/smart/template/new.htm
/smart/template/add.htm
/smart/template/view.htm
/smart/cache/
/smart/temp/
设计步骤Q?BR>1、考虑自己公司的网站的特点和已l设计的模板的结构,ȝ要实现的功能Q列出清单?/P>
2、分析功能清单,把功能分cR每一cȝ功能都是有共同点的,可以通过相同的方法实现的?/P>
3、根据功能,设计数据库的表结?/P>
4、设计一个配|文件config.inc.php, 用来记录|站的一些基本的信息,包括数据库名........
5、ؓ每一cd能设计数据库查询的接口函敎ͼq样以后怼的操作只要调用这个接口就可以了。这样避免了以后可能发生的大量的代码重复的操作,也就辑ֈ了代码复用的目的?/P>
6、定义自己对模板工具的包装函敎ͼ以后调用的时候就不用模板工L使用问题了,只有往自己的包装函数里面塞数就可以了?/P>
7、基函数已经ok了,开始轻杄面实现和模板的处理了?/P>
我们现在开始设计一个简单的pȝQ看看我是怎么一步一步地实现一个“最单的文章的发布系l”的Q当然只是我模拟的一个简单的目Q实际中一个项目可能比q要复杂的多?/P>
一、分析我的案例:
呵呵Q这个客户项目好单的啊,q福ing..........
list1.phpQ有三个文章列表和一个按钮,“php开发文章列表”“php开发热Ҏ章列表”“asp开发最新文章”“添加新文章?BR>list2.phpQ有2个文章列表“asp开发文章列表”“asp开发热Ҏ章列表?BR>new.php: 一个添加文章的表单的页?BR>add.php: 处理new.php的表单的面
view.php: 文章察看的页?/P>
二、分析功?
“php开发文章列表”“asp开发文章列表?------按文章的发布序Q倒序排列昄Q每|C?文?BR>“php开发热Ҏ章列表”“asp开发热Ҏ章列表?------按文章的点击察看ơ数排序昄文章Q显C?文?BR>“asp开发最新文章”按文章的发布顺序,倒序排列昄Q显C?文?BR>“添加新文章?-----一个文章的发布功能, 包括文章标题/作?内容
“文章察看?--------昄某篇文章内容
l合的看一?对功能进行分cd?
1、文章列表:正常的分列表、按点击数列表、按发布序的列?BR>2、文章发布:一个表单的输入和处?BR>3、文章察看:d昄文章内容
呵呵Q功能的是太简单了些?/P>
三、设计数据库Q?/P>
数据库名Qcmstest
数据表:
CREATE TABLE `article` (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR( 100 ) NOT NULL ,
`content` TEXT NOT NULL ,
`datetime` DATETIME NOT NULL ,
`clicks` INT( 11 ) ,
`pid` TINYINT( 2 ) NOT NULL ,
PRIMARY KEY ( `id` )
);
CREATE TABLE `cat` (
`cid` TINYINT( 2 ) NOT NULL ,
`cname` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `cid` )
);
------------------------------
article表是文章内容表,
----------------------------
`id` 文章~号
`title` 文章标题
`content` 文章内容
`datetime` 发布旉
`clicks` 点击?BR>`pid` 分类表号
------------------------------
cat表是文章的类别表
----------------------------
`cid` 分类表号
`cname` 分类名称
----------------------------
上面是表的数据库l构Q光有了q些q不够,q要有数?BR>INSERT INTO `cat` VALUES(1, "php开?),(2, "asp开?);
INSERT INTO `article` VALUES(1, "php开?", "php开?内容", "2004-8-1 1:1:1", 0, 1);
INSERT INTO `article` VALUES(2, "php开?", "php开?内容", "2004-8-2 1:1:1", 0, 1);
INSERT INTO `article` VALUES(3, "php开?", "php开?内容", "2004-8-3 1:1:1", 4, 1);
INSERT INTO `article` VALUES(4, "php开?", "php开?内容", "2004-8-4 1:1:1", 3, 1);
INSERT INTO `article` VALUES(5, "php开?", "php开?内容", "2004-8-5 1:1:1", 2, 1);
INSERT INTO `article` VALUES(6, "php开?", "php开?内容", "2004-8-6 1:1:1", 1, 1);
INSERT INTO `article` VALUES(7, "php开?", "php开?内容", "2004-8-7 1:1:1", 0, 1);
INSERT INTO `article` VALUES(8, "jsp开?", "jsp开?内容", "2004-8-1 1:1:1", 0, 2);
INSERT INTO `article` VALUES(9, "jsp开?", "jsp开?内容", "2004-8-2 1:1:1", 0, 2);
INSERT INTO `article` VALUES(10, "jsp开?", "jsp开?内容", "2004-8-3 1:1:1", 4, 2);
INSERT INTO `article` VALUES(11, "jsp开?", "jsp开?内容", "2004-8-4 1:1:1", 3, 2);
INSERT INTO `article` VALUES(12, "jsp开?", "jsp开?内容", "2004-8-5 1:1:1", 2, 2);
INSERT INTO `article` VALUES(13, "jsp开?", "jsp开?内容", "2004-8-6 1:1:1", 1, 2);
INSERT INTO `article` VALUES(14, "jsp开?", "jsp开?内容", "2004-8-7 1:1:1", 0, 2);
q样我们的数据库p计完了。接下来开始涉及到具体的实C?/P>
四、设计config.inc.php文g
q个文g用来讄一些web上通用的数据信息和一些参敎ͼ其他的具体的实现面都通过q个面获取需要的数据Q下面是配置的清?/P>
//数据库设|?BR>define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
define('DB_NAME', 'cmstest');
define('DB_PCONNECT', true);
// web的基本\l设|?BR>define('CMS_ROOT', 'C:/Apache2/htdocs/cmstest/');
define('CMS_SRCPATH', CMS_ROOT.'src/');
//smarttemplate 模板解析工具的设|?BR>define('SMART_REUSE_CODE', false);
define('SMART_TEMPLATE_DIR', CMS_ROOT.'smart/template/');
define('SMART_TEMP_DIR', CMS_ROOT.'smart/temp/');
define('SMART_CACHE_DIR', CMS_ROOT.'smart/cache/');
define('SMART_CACHE_LIFETIME', 100);
require_once(CMS_SRCPATH.'lib/smarttemplate/class.smarttemplate.php');
//要包含的基础文g,里面都是一些基本的函数
require_once CMS_SRCPATH.'MysqlUtil.php';
require_once CMS_SRCPATH.'ArticleUtil.php';
require_once CMS_SRCPATH.'CoreUtil.php';
require_once CMS_SRCPATH.'ParseTpl.php';
//session 控制
session_cache_limiter('private_no_expire');
session_start();
?>
其中的define('CMS_ROOT', 'C:/Apache2/htdocs/cmstest/');路经Ҏ自己apach的web路经来改Q参照最开始介l文件夹l构的地ҎQ?/P>
五、制作功能接口(1Q?/P>
首先对mysql数据库函数进行包装,化对数据库操作,|上有很多这L开源的cR但是这里我个hҎ自己的需求和习惯Q自己对mysql的函数进行了包装Q写得好坏就先不了。这个地方简单的看一下就可以了,不同的包装的cL作是不同的,而且q里的主要目的是理解q套“架构”,不用太扣代码?/P>
-------MysqlUtil.php--------
function dbConnect(){
global $cnn;
$cnn = (DB_PCONNECT? mysql_pconnect(DB_HOST, DB_NAME, DB_PASSWORD):
mysql_connect(DB_HOST, DB_NAME, DB_PASSWORD)) or
die('数据库连接错?);
mysql_select_db(DB_NAME, $cnn) or die('数据库选择错误');
mysql_query("SET AUTOCOMMIT=1");
}
function &dbQuery($sql){
global $cnn;
$rs = &mysql_query($sql, $cnn);
while($item=mysql_fetch_assoc($rs)){
$data[] = $item;
}
return $data;
}
function &dbGetRow($sql){
global $cnn;
$rs = mysql_query($sql) or die('sql语句执行错误');
if(mysql_num_rows($rs)>0)
return mysql_fetch_assoc($rs);
else
return null;
}
function dbGetOne($sql, $fildName){
$rs = dbGetRow($sql);
return sizeof($rs)==null? null: (isset($rs[$fildName])? $rs[$fildName]: null);
}
function &dbPageQuery($sql, $page=1, $pageSize=20){
if($page===null) return dbQuery($sql);
$countSql = preg_replace('|SELECT.*FROM|i','SELECT COUNT(*) count FROM', $sql);
$n = (int)dbGetOne($countSql, 'count');
$data['pageSize'] = (int)$pageSize<1? 20: (int)$pageSize;
$data['recordCount'] = $n;
$data['pageCount'] = ceil($data['recordCount']/$data['pageSize']);
$data['page'] = $data['pageCount']==0? 0: ((int)$page<1? 1: (int)$page);
$data['page'] = $data['page']>$data['pageCount']? $data['pageCount']:$data['page'];
$data['isFirst'] = $data['page']>1? false: true;
$data['isLast'] = $data['page']<$data['pageCount']? false: true;
$data['start'] = ($data['page']==0)? 0: ($data['page']-1)*$data['pageSize']+1;
$data['end'] = ($data['start']+$data['pageSize']-1);
$data['end'] = $data['end']>$data['recordCount']? $data['recordCount']: $data['end'];
$data['sql'] = $sql.' LIMIT '.($data['start']-1).','.$data['pageSize'];
$data['data'] = &dbQuery($data['sql']);
return $data;
}
function dbExecute($sql){
global $cnn;
mysql_query($sql, $cnn) or die('sql语句执行错误');
return mysql_affected_rows($cnn);
}
function dbDisconnect(){
global $cnn;
mysql_close($cnn);
}
function sqlGetOneById($table, $field, $id){
return "SELECT * FROM $table WHERE $field=$id";
}
function sqlMakeInsert($table, $data){
$t1 = $t2 = array();
foreach($data as $key=>$value){
$t1[] = $key;
$t2[] = "'".addslashes($value)."'";
}
return "INSERT INTO $table (".implode(",",$t1).") VALUES(".implode(",",$t2).")";
}
function sqlMakeUpdateById($table, $field, $id, $data){
$t1 = array();
foreach($data as $key=>$value){
$t1[] = "$key='".addslashes($value)."'";
}
return "UPDATE $table SET ".implode(",", $t1)." WHERE $field=$id";
}
function sqlMakeDelById($table, $field, $id){
return "DELETE FROM $table WHERE $field=$id";
}
?>
五、制作功能接口(2Q?/P>
下面来正式的看看Q我们共要实现的功能q行的包?/P>
------------ArticleUtil.php----------------
//昄文章列表的函?BR>//getArticleList(文章cd, 排序Ҏ, 当前昄W几? 每页昄几条)
function getArticleList($catId, $order, $page, $pageSize){
$sql = "SELECT * FROM article WHERE pid=$catId ORDER BY $order";
return dbPageQuery($sql, $page, $pageSize);
}
//查询某个文章的内?BR>//getArticle(文章~号)
function getArticle($id){
$sqlUpdate = "UPDATE article SET clicks=clicks+1 WHERE id=$id";
dbExecute($sqlUpdate);
$sql = "SELECT * FROM article WHERE art_id=$id";
return dbGetRow($sql);
}
//d文章
//addArticle(文章内容数组)
function addArticle($data){
$sql = sqlMakeInsert('article', $data);
return dbExecute($sql);
}
?>
q段代码是不是就单多了啊Q这是自己对mysql函数q行包装的好处!
下面来研I一下他们是怎么实现我们的功能的呢?BR>“php开发文章列表?-------getArticleList(1, "id DESC", $page, 5)
“asp开发文章列表?-------getArticleList(2, "id DESC", $page, 5)
“php开发热Ҏ章列表?---getArticleList(1, "clicks DESC, id DESC", 1, 3)
“asp开发热Ҏ章列表?---getArticleList(2, "clicks DESC, id DESC", 1, 3)
“asp开发最新文章?-------getArticleList(2, "id DESC", 1, 3)
“添加新文章?------------addArticle($data)
“察看文章?--------------getArticle($id)
六、对smarttemplatec进行包装(革命未成功Q同志仍d力)
具体的smarttemplate的用这里就不讲了,不然口水讲没了,都讲不完。下面这个是具体的对包装函数
-------------ParseTpl.php----------------
function renderTpl($viewFile, $data){
$page = new SmartTemplate($viewFile);
foreach($data as $key=>$value){
if(isset($value[data])){
$page->assign($key, $value[data]);
unset($value[data]);
$page->assign($key."_page", $value);
} else {
$page->assign($key, $value);
}
}
$page->output();
}
?>
七:文章列表察看面实现和模板处理(万里长征的最后一步)
先来看看面list1的实?在list1里面分页用了一个page.js文gQ这个文件是自己l自己写的一个js分页的函敎ͼ挺好用的
---------------page.js---------------
//--------?20 条记录,当前 86/99 ?[1]... [82] [83] [84] [85] [86] [87] [88] [89] [90] ...[99] GO-------------------
//recordCount = 20;
//show = 20
//pageShow = 11;
//pageCount = 100;
//pageNow = 86;
//pageStr = "?page=_page_";
//document.write(showListPage(recordCount, show, pageCount, pageNow, pageStr));
function showListPage(recordCount, show, pageShow, pageCount, pageNow, pageStr){
if(pageCount<1) pageCount =0;
if(pageNow<1) pageNow = 0;
str = '?'+recordCount+' 条记录,当前 '+pageNow+'/'+pageCount+' ?';
if(pageCount<=pageShow){
startHave = false;
endHave = false;
startNum = 1;
endNum = pageCount;
} else if(pageNow-1 <= pageShow/2){
startHave = false;
endHave = true;
startNum = 1;
endNum = pageShow-1;
} else if(pageCount-pageNow <= pageShow/2){
startHave = true;
endHave = false;
startNum = pageCount - pageShow + 2;
endNum = pageCount;
} else {
startHave = true;
endHave = true;
startNum = pageNow - Math.floor((pageShow-2)/2);
endNum = startNum + pageShow - 3;
}
if(startHave){
startStr = " [1]... ";
str += startStr;
}
for(i=startNum; i<=endNum; i++){
if(pageNow==i)
str += "[" + i + "]";
else
str += " [" + i + "] ";
}
if(endHave){
endStr = " ...[" + pageCount + "] ";
str += endStr;
}
return str;
}
--------------list1.htm----------------
d新文?
--------------------------------------------------------------------------------
php开发文?
{id}--{title}
--------------------------------------------------------------------------------
php开发热Ҏ?
{id}--{title}
--------------------------------------------------------------------------------
asp开发最新文?
{id}--{title}
--------------list1.php----------------
require_once "config.inc.php";
dbConnect();
$data = array();
$data[phplist] = getArticleList(1, "id DESC", (int)$_GET[page], 5);
$data[phphotlist] = getArticleList(1, "clicks DESC, id DESC", 1, 3);
$data[aspnewlist] = getArticleList(2, "id DESC", 1, 3);
dbDisconnect();
renderTpl('list1.htm', $data);
?>
q行的效果怎么P是不是实C要求的功能呢。现在我们再做一下改动,在里面加上“asp开发热Ҏ章列表”,实现代码如下
--------------list1.htm----------------
d新文?
--------------------------------------------------------------------------------
php开发文?
{id}--{title}
--------------------------------------------------------------------------------
php开发热Ҏ?
{id}--{title}
--------------------------------------------------------------------------------
asp开发最新文?
{id}--{title}
asp热点文章
{id}--{title}
--------------list1.php----------------
require_once "config.inc.php";
dbConnect();
$data = array();
$data[phplist] = getArticleList(1, "id DESC", (int)$_GET[page], 5);
$data[phphotlist] = getArticleList(1, "clicks DESC, id DESC", 1, 3);
$data[aspnewlist] = getArticleList(2, "id DESC", 1, 3);
$data[asphotlist] = getArticleList(2, "clicks DESC, id DESC", 1, 3);
dbDisconnect();
renderTpl('list1.htm', $data);
?>
仔细观察一下前后的区别Qlist1.php里面只是单的加入了一行的代码Q就实现q个改动Q感觉怎么样啊Q是不是单?/P>
其实q种设计模式的好处还不只是这点:
1、可以把E序的核心代码隔d理Q便于以后程序的理l护
2、对于程序的可扩展性也很好Q假设list1.php中要加入产品列表Q我是不是也可以q么做呢Q把对品的理也写成统一的数据库操作接口Q然后简单的修改模板文g加入产品列表部分Q最后在list1.php中加入一行函数调用的代码Q就可以实现?BR>3、代码复用,如果您是做中型企业|站的,那这么做Ҏ的好处是最大的Q因U类型的|站的设计结构几乎是一LQ您可能只需要更改一下模板的样式Q就可以赚到钞票了?/P>
q么看来q种模式是不是给您带来了很多的好处呢Q?/P>
-----------lsit2.htm---------------
d新文?
原文Q?A target=_blank>http://pear.php.net/manual/en/standards.php
译Q廖宇雷
最后更新日期:2003/05/06
内容列表
~进
~进使用4个空|而不?tab。如果你使用 Emacs ~辑 PEAR 代码Q你应该讄 indent-tabs-mode ?nil。下面是一?mode hook 的示例,用于讄 Emacs W合~进标准Q你必须保在编?PHP 文gӞq些讄发生作用Q:
(defun php-mode-hook ()
(setq tab-width 4
c-basic-offset 4
c-hanging-comment-ender-p nil
indent-tabs-mode
(not
(and (string-match "/\\(PEAR\\|pear\\)/" (buffer-file-name))
(string-match "\.php$" (buffer-file-name))))))
q里是同{效果的 vim 规则Q?/P>
set expandtab
set shiftwidth=4
set softtabstop=4
set tabstop=4
控制l构
控制l构包含 if、for、while、switch {。这里有一?if 语句的示例和一?switch 语句的示例:
if 语句的示例:
<?php
if ((condition1) || (condition2)) {
action1;
} elseif ((condition3) && (condition4)) {
action2;
} else {
defaultaction;
}
?>
switch 语句的示例:
<?php
switch (condition) {
case 1:
action1;
break;
case 2:
action2;
break;
default:
defaultaction;
break;
}
?>
控制语句应该在控制关键词和开始的圆括号之间应该有一个空|以此和函数调用进行区别?/P>
强烈你L使用花括号将控制l构各部分标识出来。即使是在技术上可以不用花括号的地斏V这可以增加代码的可L,同时避免在结构部分增加新行后引入逻辑上的错误?/P>
原始代码Q?/P>
if (condition)
return true;
else
return false;
修改后的代码Q?/P>
if (condition)
do something; // 出现逻辑错误
return true;
else
return false;
正确的做法:
if (condition) {
do something;
return true;
} else {
return false;
}
函数调用
调用函数Ӟ函数名和开始的括号之间不应该有I白字符。参数和开始及l束的括号之间不应有I格。而除W一个参数外Q其他参数都应该用一个空格分隔。这里有一个示例:
<?php
$var = foo($bar, $baz, $quux);
?>
像上面的CZ代码Q赋D等号两辚w应该使用一个空根{如果是相关的赋D,应该采用下面的Ş式以提供更好的可L:
<?php
$short = foo($bar);
$long_variable = foo($baz);
?>
函数定义
按照“one true brace”约定声明函敎ͼ
<?php
function fooFunction($arg1, $arg2 = '')
{
if (condition) {
statement;
}
return $val;
}
?>
“one true brace”约定就是开始的花括号单独占一行,而不是跟在其他语句后面?/P>
h默认值的参数应该位于参数列表的后面(事实?PHP 语言定义也要求如此)。如果适合Q函数应该Lq回一个有意义的倹{这里有一个稍微长一点的CZQ?/P>
<?php
function connect(&$dsn, $persistent = false)
{
if (is_array($dsn)) {
$dsninfo = &$dsn;
} else {
$dsninfo = DB::parseDSN($dsn);
}
if (!$dsninfo || !$dsninfo['phptype']) {
return $this->raiseError();
}
return true;
}
?>
注释
cdQclassQ的联机文档应该W合 PHPDocQ类g JavaDocQ的U定。更多关?PHPDoc 的信息可以访?http://www.phpdoc.de/ 获得?/P>
此外Q强烈鼓׃用非文档注释。一般性规则是对于那些Ҏ忘记作用的代码添加简短的介绍性注释?/P>
推荐使用 C 样式的注释(/* */Q和标准 C++ 注释Q?/)Q而不应该使用 Perl/shell 样式的注释(#Q?/P>
包含代码
无论在什么地Ҏ条g包含一个类型文Ӟ应该使用 require_once()。如果有条g的包含一个类型文Ӟ例如使用工厂ҎQ,应该使用 include_once()。用两者中的Q何一个都能够保cd文g只包含一ơ。它们共享一个文件列表,因此你不需要担心淆他?—?一个文件?require_once() 包含后不会在 include_once() 中再一ơ被包含?/P>
备注Q?SPAN class=input>include_once() ?require_once() 是一个声明,而不是函数。你不需要用圆括号文件名扩v来(不过使用括号也不会出现错误)?/P>
PHP 代码标记
L使用 <?php ?> 来界?PHP 代码Q而不要?<? ?> 速记方式。这是ؓ了符?PEAR 一致性所必须的,同时也是在不同操作系l和不同安装讄环境下移?PHP 代码所要求的?/P>
头注释块
PEAR 发布的所有源代码文g头部都应该包含下面的注释块:
<?php
/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP version 4 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2002 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Original Author <author@example.com> |
// | Your Name <you@example.com> |
// +----------------------------------------------------------------------+
//
// $ Id $
?>
q里没有性规定要一个代码A献者的名字d到文件注释的作者列表中。一般情况下Q他们的更改属于“substantial”目录(意味大约10%?0%的代码被改写Q。有一个例外就是代码A献者重写了函数或者A献了新的E序逻辑?/P>
单的代码重组?bug 修复不应该增加新作者,q是不恰当的?/P>
不在核心 PEAR 仓库中的文g应该有一个类似的注释块来说明版权、许可协议和作者。所有文件应该包含一个模式行QmodelineQ用?vim ?emacsQ以保一致性?/P>
使用 CVS
q个节的内容仅仅适用?cvs.php.net 上?CVS 的包?/P>
在每一个文件中包含 $Id $Q两?$ W号之间的关键字不能够有I格Q但׃此文档也是用 CVS 理Q因此只好加个空|避免?CVS 替换掉) CVS 关键字,以便查看文g当前状态和最后修Ҏ间等信息。如果已l存在“Last Modified:”这L信息Q则替换?$Id $ 标记?/P>
q个节的其他内容假定你有关?CVS 标记和分支(branchesQ的基本知识?/P>
CVS 标记用于标识你包中的文g释放之前所作的修订。下面的列表是必需使用和徏议用的 CVS 标记Q?/P>
RELEASE_n_n
Q必需的)用于标记一个释攄本。如果你没有使用q个标记Q别人就没有办法在你发布一个释攄本时?CVS 服务器获取你的包?/P>
QA_n_n
Q分支,可选)如果你觉得在发布释放版本之前要提供一个候选释攄本,那么一个好L是增加一个分支。这个分支可以让你将释放版本隔离出来Qƈ在正式发布释攄本之前可以ؓq些分支单独应用更新。期_正常的开发工作可以在d上l进行?/P>
MAINT_n_n
Q分支,可选)如果你需要创Z个较修改的释放版本Q例如在 1.2 之后发布 1.2.1Q。那么你可以创徏一个分支来辑ֈ目的?/P>
仅有 RELEASE 标记是必ȝQ其他标Cؓ了方便推荐你使用?/P>
下面是一个如何ؓ "Money_Fast" ?1.2 释放版本增加标记的示例:
$ cd pear/Money_Fast
$ cvs tag RELEASE_1_2
T Fast.php
T README
T package.xml
l过上面的操作,可以在 PEAR Web |站上获取你的一pd释放版本了?/P>
q里是一个如何徏?QA 分支的示例:
$ cvs tag QA_2_0_BP
...
$ cvs rtag -b -r QA_2_0_BP QA_2_0
$ cvs update -r QA_2_0
$ cvs tag RELEASE_2_0RC1
...and then the actual release, from the same branch:
$ cvs tag RELEASE_2_0
"QA_2_0_BP" 标记是一?"branch point" 标记Q用于标记分支的开始。L用这L标记来标明分支的开始是一个好L。MAINT 分支可以使用 RELEASE 标记作ؓ它的分支L?/P>
CZ中的 URL
所有示例中用到?URL 地址都应该是 "example.com"?example.org"?example.net"?/P>
命名U定
一般而言Qclass、函数和变量的名字应该L能够描述让代码阅读者能够容易的知道q些代码的作用?/P>
Classes
class 应该h一个描q性的名字。可能时应该避免使用~写。class 名字应该L用一个大写字母开始。从 class 名字中也能够反映?PEAR class 的层ơ。层ơ中的每个别都用下划线q行分隔。好?class 名字CZ如下Q?/P>
Log
Net_Finger
HTML_Upload_Error
函数和方?/P>
函数和方法应该?"studly caps" 样式命名。函数应该将所在包的名字作为前~Q以避免与其他包的函数发生名字冲H。名字的受字母(前缀之后Q应该是写Q每一个新单词应该以大写字母开头。下面是一些示例:
connect()
getData()
buildSomeWidget()
XML_RPC_serializeData()
U有 class 成员和属性(意味着 class 成员和属性只应该由同一?class 中声明的成员使用。不q?PHP q不支持强制性的U有命名I间Q应该用一个下划线开头。示例:
_sort()
_initTree()
$this->_status
常数
常数应该L全部使用大写字母命名Q用下划U来分隔单词。常数名字的前缀应该使用大写?class/?名字。例如:DB:: 包用的所有常数都?DB_ 开头?/P>
全局变量
如果你的包需要定义全局变量Q那么应该用下划U跟上包的名字和另一个下划线作ؓ开头。例如,PEAR 包用一个全局变量名ؓ $_PEAR_destructor_object_list?/P>
预定义的?true、false ?null
PHP 的内建?true、false ?null 必须全部用小写字母书写?/P>
之前用过的一些函敎ͼ最q会陆箋做些整理?/FONT>
获得最和最大g间随机数Q位C?BR>
来源Qhttp://freshmeat.net/projects/phpwiki/?topic_id=22%2C27%2C92%2C847%2C90 PhpWiki是一个用PHP写的WikiWikiWeb的克隆品。Wiki是一个Web 站点QQ何h可以通过一个浏览器~辑和修改网cPhpWiki无需复杂的设|,生成默认面Q它使合作项目变得更加方便,可以自由的讨论,方便的编辑和索?nbsp; |
|
引用?http://prdownloads.sourceforge.net/phpwiki/
[php]预定义变?一) $_SERVER (附:获取当前URL地址例子) |
例: 我需?获取当前?的URL 地址$url_this = "http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
服务器变量:$_SERVER? ?PHP 4.1.0 及以后版本用。之前的版本Q?$HTTP_SERVER_VARS? $_SERVER 是一个包含诸如头?headers)、\?paths)和脚本位|?script locations)的数l。数l的实体?web 服务器创建。不能保证所有的服务器都能生所有的信息Q服务器可能忽略了一些信息,或者生了一些未在下面列出的新的信息。这意味着Q大量的q些变量?CGI 1.1 specification 中说明,所以您应该仔细研究它? q是一个“superglobal”,或者可以描qCؓ自动全局变量。这只不q意呌它在所有的脚本中都有效。在函数或方法中您不需要?global $_SERVER; 讉K它,如同?$HTTP_SERVER_VARS 一栗? $HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量。(注意Q?$HTTP_SERVER_VARS ?$_SERVER 是不同的变量QPHP 处理它们的方式不同。) 如果讄?register_globals 指oQ这些变量也在所有脚本中可用Q也是Q分M $_SERVER ?$HTTP_SERVER_VARS 数组。相关信息,请参阅安全的相关章节 使用 Register Globals。这些单独的全局变量不是自动全局变量? 您或怼发现下面列出的某?$_SERVER 元素q不可用。注意,如果以命令行方式q行 PHPQ下面列出的元素几乎没有有效的(或是没有M实际意义的)? “PHP_SELF?BR>当前正在执行脚本的文件名Q与 document root相关。D例来_在URL地址?http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 会得到 /test.php/foo.bar q个l果? 如果 PHP 以命令行方式q行Q该变量无效? “argv?BR>传递给该脚本的参数。当脚本q行在命令行方式Ӟargv 变量传递给E序 C 语言样式的命令行参数。当调用 GET ҎӞ该变量包含请求的数据? “argc?BR>包含传递给E序的命令行参数的个敎ͼ如果q行在命令行模式Q? “GATEWAY_INTERFACE?BR>服务器用的 CGI 规范的版本。例如,“CGI/1.1”? 'SERVER_NAME' 'SERVER_SOFTWARE' “SERVER_PROTOCOL?BR>h面旉信协议的名U和版本。例如,“HTTP/1.0”? “REQUEST_METHOD?BR>讉K面时的hҎ。例如:“GET”、“HEAD”,“POST”,“PUT”? “QUERY_STRING?BR>查询(query)的字W串? “DOCUMENT_ROOT?BR>当前q行脚本所在的文档根目录。在服务器配|文件中定义? “HTTP_ACCEPT?BR>当前h?Accept: 头部的内宏V? “HTTP_ACCEPT_CHARSET?BR>当前h?Accept-Charset: 头部的内宏V例如:“iso-8859-1,*,utf-8”? “HTTP_ACCEPT_ENCODING?BR>当前h?Accept-Encoding: 头部的内宏V例如:“gzip”? “HTTP_ACCEPT_LANGUAGE?BR>当前h?Accept-Language: 头部的内宏V例如:“en”? “HTTP_CONNECTION?BR>当前h?Connection: 头部的内宏V例如:“Keep-Alive”? “HTTP_HOST?BR>当前h?Host: 头部的内宏V? “HTTP_REFERER?BR>链接到当前页面的前一面?URL 地址。不是所有的用户代理Q浏览器Q都会设|这个变量,而且有的q可以手工修?HTTP_REFERER。因此,q个变量不L正确真实的? “HTTP_USER_AGENT?BR>当前h?User_Agent: 头部的内宏V该字符串表明了讉K该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。您也可以?get_browser() 得到q个信息? “REMOTE_ADDR?BR>正在览当前面用户?IP 地址? 'REMOTE_HOST' ? 必须配置 Web 服务器来建立此变量。例?Apache 需要在 httpd.conf 中有 HostnameLookups On。参?gethostbyaddr()? “REMOTE_PORT?BR>用户q接到服务器时所使用的端口? “SCRIPT_FILENAME?BR>当前执行脚本的绝对\径名? “SERVER_ADMIN?BR>该值指明了 Apache 服务器配|文件中?SERVER_ADMIN 参数。如果脚本运行在一个虚拟主ZQ则该值是那个虚拟L的倹{? “SERVER_PORT?BR>服务器所使用的端口。默认ؓ?0”。如果你使用 SSL 安全q接Q则q个gؓ您所讄?HTTP 端口? “SERVER_SIGNATURE?BR>包含服务器版本和虚拟L名的字符丌Ӏ? “PATH_TRANSLATED?BR>当前脚本所在文件系l(不是文档根目录)的基本\径。这是在服务器进行虚拟到真实路径的映像后的结果? “SCRIPT_NAME?BR>包含当前脚本的\径。这在页面需要指向自己时非常有用? “REQUEST_URI?BR>讉K此页面所需?URI。例如,?index.html”? “PHP_AUTH_USER?BR>?PHP q行?Apache 模块方式下,q且正在使用 HTTP 认证功能Q这个变量便是用戯入的用户名? “PHP_AUTH_PW?BR>?PHP q行?Apache 模块方式下,q且正在使用 HTTP 认证功能Q这个变量便是用戯入的密码? “AUTH_TYPE?BR>?PHP q行?Apache 模块方式下,q且正在使用 HTTP 认证功能Q这个变量便是认证的cd?/FONT> |