[转]PHP编码规范

横流:这是10年前之一律篇PHP编码规范,最早发表于清华水木BBS,现在相近都找不交整的本子了,但时至今日看起以是怪有参考意义。个人会依据涉做片调。文中对于命名一段落的描述极大的曾启发了私的编程体验。如今php-fig小组发布之PSR系列规范,更为合理,请参考相应标准文档。

1. 介绍

1.1. 标准的重大

标准问题在少数地方达成于每个人头痛,让众人都觉得豪门处于同一的境界。这促进让这些建议以许多的品类受到不停演进,许多庄花费了过多星期逐子字逐句的展开争论。标准化不是超常规之个人风格,它对地面改良是完全开放之。

1.2. 优点

当一个品类尝试着遵守公用的科班时,会出以下好处:

· 程序员可以了解任何代码,弄清程序的景象
· 新人可快速的适应环境
· 防止新接触php的口由于节省时间的急需,自创始一仿风格并养成终生的惯
· 防止新接触php的人头一次次的犯同样的一无是处
· 在同等的条件下,人们得以削减犯错的空子
· 程序员们发了相同的仇人

1.3. 缺点

· 标准要出于一些未亮堂php的口所制定,通常看上去挺傻
· 因为专业以及我开的莫相同,所以标准一般看上去十分愚蠢
· 标准降低了创造力
· 标准在遥远互相合作的人流被凡从来不必要的
· 标准强迫太多的格式

1.4. 讨论

群类别的阅历可知得出这样的结论:采用编程标准可要项目越来越顺风地就。标准是打响之重中之重也?当然不。但她可助我们,而且我们用我们能博得的备的佑助!老实说,对一个细节标准的绝大多数争主要是源自自负思想。对一个合理之正规化的充分少决定能被说呢是缺少技术性的语,那只是是脾胃之缘故罢了。所以,要活的主宰自负思想,记住,任何类型还有赖于团队协作之着力。

1.5. 解释

1.5.1. 正式履

第一应该当出小组的内部找有有的顶要紧之元素,也许标准对君的景尚不够恰当。它或许早已席卷了
重要的问题,也恐怕还有人对里面的少数问题代表强烈的不予。无论在什么情况下,只要最后胜利的讲话,人们将成熟之敞亮到之标准是成立之,然后另外的程序员们吧会见发觉她的成立,并道带在有保存去按这等同规范是值得的。如果无自觉的搭档,可以制定需求:标准肯定要由此代码的检查。如果没检查之言语,这个解决方案只有是一个确立以无规范的底子及之一律杀群可笑的食指。

1.5.2. 确认观点

  1. 眼看无益;
  2. 恐怕可行吧,但是其既是无实用又俗;
  3. 即是真,而且自己为告诉过你哟;
  4. 夫是本人先想到的;
  5. 自就该如此。
    如您带来在否定的成见而来对事物的话,请而保持开放之想。你按照好做出它是废话的下结论,但是做出结论的艺术就是您必要会经受不同之思考。请你吃好一点日子去做到它。

1.5.3. 类型的季个阶段

  1. 数据库结构
  2. 设计
  3. 数据层
  4. UI层

2. 命名规则

2.1. 适中的命名

取名是次设计的骨干。古人相信只要了解一个丁真的名即会获取胜出于那个人以上的不可思议的力量。只要你被物想到是的名字,就会见让你及后来底人带来比较代码更胜似之力量。别笑!

名即是事物在其所处之生态环境中一个经久不衰而深远的结果。总的来说,只发生询问系统的程序员才会也系统取出最贴切的名字。如果持有的命名都与该自相适合,则提到清晰,含义可以推导得出,一般人之推论也会当预料中。

若您发觉你的命名只有为数不多力所能及跟夫针对性承诺事物相匹配的讲话,
最好或更好好再探你的规划吧。

2.2. 类命名

· 在呢接近(class
)命名前先是使懂它是呀。如果通过类名的供的端倪,你要想不起这个看似是什么的语,那么您的宏图虽还开的免足够好。
·
超过三独词做的混合名是爱招系统依次实体间的混淆,再望您的计划,尝试采用(CRC
Session card)看看该命名所对应的实体是否有那么基本上之功用。
·
对于派生类的命名该避免带那父类名的诱惑,一个类似的名只是与它们本身有关,和她的父类叫什么无关。
· 有时后缀名是卓有成效的,例如:如果您的网运用了代办(agent
),那么就将某部部件命名吧“下载代理”(DownloadAgent)用以真正的传递信息。

2.3. 措施与函数命名

·
通常每个方法及函数都是推行一个动作之,所以对它的命名该懂得的印证其是开啊的:用CheckForErrors()代替ErrorCheck(),用DumpDataToFile()代替DataFile()。这么做为堪要效益以及数据化再不过分别的体。
· 有时后缀名是有效之:

o Max – 含义吗某个实体所能给予的太要命价值。
o Cnt – 一个周转着之计数变量的手上价值。
o Key – 键值。
譬如:RetryMax 表示最好多重试次数,RetryCnt 表示目前重试次数。

· 有时前缀名是中的:

o Is –
含义为咨询一个有关某样事物的题材。无论何时,当人们看来Is就会理解这是一个题目。
o Get – 含义为博一个数值。
o Set – 含义为设定一个数值
例如:IsHitRetryLimit。

2.4. 缩写歌词毫不所有采取好写字母

· 无论如何,当遇以下情形,你得用首字母大写那余字母小写来取代全部施用大写字母的法门来代表缩写词。
使用:
GetHtmlStatistic.
不使用:
GetHTMLStatistic.

理由

·
当命名含有缩略词时,人们似乎有着非常差的直觉。统一确定是最好好,这样一来,命名的意思就是净好预知了。
举个NetworkABCKey的例证,注意C是应该是ABC里面的C还是key里面的C,这个是死令人费解的。有些人不在意这些,其他人也很腻这样。所以你见面当不同之代码里观看不同的条条框框,使得你莫亮堂怎么去给其。
例如
class FluidOz // 不要写成 FluidOZ
class GetHtmlStatistic // 不要写成
GetHTMLStatistic

2.5. 类命名

· 使用好写字母作为词的隔,其他的假名都采取小写
· 名字的首字母使用大写
· 不要用下划线(‘_’)

理由

· 根据众多底命名方式,大部分人数认为这么是最最好的方式。
例如
class NameOneTwo
class Name

2.6. 类库命名

·
目前定名空间在越来越普遍的给下,以避免不同厂商跟团组织类库间的类名冲突。
·
当尚未采取命名空间的当儿,为了避免类名冲突,一般的做法是当类名前增长新鲜之前缀,两单字符就好了,当然多为此有会见更好。

例如

John Johnson的数据结构类库可以用Jj做啊前缀,如下:
class JjLinkList
{
}

外一样栽折中方法是起涵盖类库目录(事实上Java也是如此做的),以死之目录代表不同之命名空间。

例如
Microsoft的数据库相关类库可以以:
/classes/com/Microsoft/ Database/DbConn.php
Apache的数据库相关类库可在:
/classes/org/apache/Database/DbConn.php

2.7. 措施命名

· 采用与类似命名一致的规则,但首配母小写

理由

· 使用有不同规则的大多数总人口发觉及时是无限好的折衷办法。

例如
class NameOneTwo
{
function doIt() {};
function handleError() {};
}

2.8. 类特性命名

· 属性命名该以字符‘m’为前缀。
·
前缝‘m’后下给类命名一致的条条框框。
·
‘m’总是在名字的初步起修饰作用,就比如为‘r’开头表示援引一样。

理由

·
前缀’m’防止类属**以及法名来其他冲突。你的方法名和属**号称经常会坏接近,特别是存取元素。

例如
class NameOneTwo
{
function VarAbc() {};
function ErrorNumber() {};
var $mVarAbc;
var $mErrorNumber;
var $mrName;
}

2.9. 方吃参数命名

· 第一只字符使用小写字母。
· 在首配符后的有所字都按照类命名规则首字符大写。

理由

· 可以分别方法中之一般变量。
· 你得应用与类名相似的名号而不至于生重名冲突。

例如
class NameOneTwo
{
function StartYourEngines(
&$rSomeEngine,
&$rAnotherEngine);
}

2.10. 变量命名

· 所有字母都用小写
· 使用’_’作为每个词之交界。

理由

· 通过这等同门路,代码中变量的作用域是鲜明的。
· 所有的变量在代码中都看起不同,容易辨别。
例如
function handleError($errorNumber)
{
$error = OsErr($errorNumber);
$time_of_error = OsErr->getTimeOfError();
$error_processor = OsErr->getErrorProcessor();
}

2.11. 援变量和函数返回引用

· 引用得带‘r’前缀

理由

· 使得项目不同之变量容易辨认
·
它好确定谁方法返回可改对象,哪个方法返回不可变更对象。

例如
class Test
{
var mrStatus;
function DoSomething(&$rStatus)
{};
function &rStatus() {};
}

2.12. 全局变量

· 全局变量应该带前缀‘g’。

理由

·
知道一个变量的作用域是怪主要的。
例如
global $gLog;
global &$grLog;

2.13. 定义命名 / 全局常量

· 全局常量用’_’分隔每个单词。

理由

立刻是命名全局常量的风俗。你若留意不要跟其它的定义相冲突。

例如
define(“A_GLOBAL_CONSTANT”, “Hello world!”);

2.14. 静态变量

· 静态变量应该带前缀‘s’。

理由

·
知道一个变量的作用域是颇重大的。

例如
function test()
{
static $msStatus = 0;
}

2.15. 函数命名

· 函数名下C GNU的老规矩,所有的字母使用小写字母,使用’_’分割单词。

理由

· 这样可以更易区分相关联的类名。

例如
function some_bloody_function()
{
}

2.16. 荒唐返回检测规则

· 检查有的网调用的错误信息,除非你如果不经意错误。
· 为各个条系统错误信息定义好系统错误文本以便include。

  1. 开规则

3.1. 大括号 {} 规则

在三种植重大的大括号放置规则中,有点儿栽是好接受之,如下的率先种是最好好之:

· 将大括如泣如诉放置在重大词下方的跟列处:
if ($condition) while ($condition)
{ {
… …
} }
· 传统的UNIX的括号规则是,首括号与根本词同行,尾括号及主要字同列:
if ($condition) { while ($condition) {
… …
} }

理由

·
引起强烈争论的非原则的题目而是通过折衷的措施缓解,两种植办法任意一种植都是好承受之,然而对绝大多数人数的话再爱好第一种。原因纵然是思想研究学习范畴的事物了。
对于再次爱第一种植还持有更多的因由。如果您运的字符编辑器支持括号匹配功能的话语(例如vi),最重点的哪怕是生一个好之体裁。为什么?我们说当您有一致百般块的顺序同时想掌握就同一老大块程序是于何处了的语句。你先转移到开之括号,按下按钮编辑器就会见找到与的相应的结括号,例如:
if ($very_long_condition && $second_very_long_condition)
{

}
else if (…)
{

}

从今一个主次块移动到其他一个程序块就待为此光标和而的括号匹配键就可了,不欲找匹配的括号。

3.2. 缩进/制表符/空格 规则

· 使用制表符缩进。
· 使用三及四个空格为各个层次缩进。
·
不再行使要同有需要不畏缩排的方法。对于极端要命缩进层数,并没有一个定点的规规矩矩,假如缩进层数大于四要么五层的时段,你得设想在拿代码因数分解(factoring
out code)。
理由
· 许多编程者支持制表符。
· 当人们以差异太死之制表符标准吧,会使阅读代码变得够呛艰难。
·
如此多的口甘愿限定最可怜之缩进层数,它便没有吃看成是一律宗工作。我们相信程序员们会明智之选料嵌套的深。
例如
function func()
{
if (something bad)
{
if (another thing bad)
{
while (more input)
{
}
}
}
}

3.3. 小括如泣如诉、关键词以及函数 规则

· 不要管小括号以及严重性词紧贴于同步,要因此空格隔开它。
· 不要管小括号以及函数名紧贴在协同。
· 除非必要,不要在Return返回语句被使小括号。
理由
·
关键字勿是函数。如果小括号紧贴着函数名叫以及严重性字,二者很易让看做是紧密的。
例如
if (condition)
{
}

while (condition)
{
}

strcmp($s, $s1);

return 1;

3.4. 别在对象架构函数着举行实在的干活

转变当目标架构构造函数中举行实在的行事,
构造函数应该包含变量的初始化和(或)不会见有失败的操作。

 

理由
· 构造不克回来错误 。

例如
class Device
{
function Device() { /* initialize and other stuff */ }
function Open() { return FAIL; }
};

$dev = new Device;
if (FAIL == $dev->Open()) exit(1);

3.5. If Then Else 格式

布局
即时是因为程序员决定。不同的花括号样式会产生若干微不同的样观。一个通用方是:
if (条件1) // 注释
{
}
else if (条件2) // 注释
{
}
else // 注释
{
}
假定您生因此到else if
语词的话,通常最有一个else块以用于拍卖不处理及之任何情形。可以的语句放一个记录信息注释在else处,即使在else没有任何的动作。
规范格式
连将恒量放在等号/不等于号的左边,例如:
if ( 6 == $errorNum ) …
一个因是要是你当等式中漏了一个等号,语法检查器会为卿报错。第二只由是您会及时找到数值而无是以您的表达式的后找到她。需要或多或少日来习惯这格式,但是它们真的怪有因此。

3.6. switch 格式

·
当一个case块处理后,直接改动至下一个case块处理,在这case块的末梢当加上注释。
· default
case总该存在,它应该无给到达,然而要达了便会见触发一个荒唐。
· 如果您要是创建一个变量,那就算管具有的代码放在块被。
例如
switch (…)
{
case 1:

// FALL THROUGH
case 2:
{
$v = get_week_number();

}
break;

default:
}

3.7. continue,break 和 ? 的使用

3.7.1. Continue 和 Break
Continue 和 break 其实是变相的影的 goto方法。
Continue 和 break 像 goto
一样,它们以代码中是发生魔力的,所以要是省(尽可能少)的应用其。使用了及时等同简易的魔法,由于局部不公开之原委,读者将会让定向到只有上帝才知的地方失去。
Continue有点儿只关键的题目:
· 它可绕了测试条件。
· 它可绕了当/不等表达式。
省下面的例证,考虑一下问题且当哪儿有:
while (TRUE)
{

// A lot of code

if (/* some condition */) {
continue;
}

// A lot of code

if ( $i++ > STOP_VALUE) break;
}
在意:”A lot of
code”是须的,这是为吃程序员们不克那么爱之检索有错误。
经以上的例证,我们好汲取更进一步的平整:continue 和 break
混合使用是引起灾难的不错方法。
3.7.2. ?:
烦在于人们往往试着当 ? 和 :
之间塞满了多的代码。以下的是有些分明的连续规则:
· 把规范在括号内盖使她同任何的代码相分离。
· 如果可能的话,动作可据此简单的函数。
· 把所举行的动作,“?”,“:”放在不同之实践,除非他们得以知晓的居同一行。
例如
(condition) ? funct1() : func2();

or

(condition)
? long statement
: another long statement;

3.8. 声称块的恒

· 声明代码块需要针对共同。
理由
· 清晰。
· 变量初始化的接近代码块应该列表。
· &应靠近类型,而不是变量名。
例如
var $mDate
var& $mrDate
var& $mrName
var $mName

$mDate = 0;
$mrDate = NULL;
$mrName = 0;
$mName = NULL;

3.9. 每行一个说话

惟有这些告诉句有甚细心的联系,否则每行只写一个言。

3.10. 短方法

办法代码要限制于一如既往页内。

3.11. 记下有的空语句

连日记录下for或者是while的空块语句,以便掌握的理解该段代码是漏掉了,还是故意不写的。

while ($dest++ = $src++)
; // VOID

3.12. 并非使用缺省方法测试不零值

毫无用缺省值测试不零值,也即是使:

if (FAIL != f())
于下的方式好:

if (f())

就算 FAIL 可以蕴涵 0 值
,也不怕是PHP认为false的意味。在某决定就此-1代替0作为黄返回值的上,一个显式的测试就好帮助而了。就终于比较值不见面变动呢该用显式的较;例如:if
(!($bufsize % strlen($str)))应该写成:if (($bufsize % strlen($str)) ==
0)以表示测试的数值(不是布尔)型。一个不时发出题目之地方即是用strcmp来测试一个字符等式,结果永远也未见面等于缺省值。
匪零测试用基于缺省值的做法,那么其它函数或表达式就会被以下的限定:
· 只能回去回0表示失败,不能够啊/有另的价。
·
命名以便让一个着实(true)的返回值是纯属显然的,调用函数IsValid()而休是Checkvalid()。

3.13. 布尔逻辑类型

绝大多数函数在FALSE的当儿回来回0,但是达非0值就象征TRUE,因而不用为此1(TRUE,YES,诸如此类)等式检测一个布尔值,应该用0(FALSE,NO,诸如此类)的不等式来替代:

if (TRUE == func()) { …
该写成:

if (FALSE != func()) { …

3.14. 平凡避免嵌入式的赋值

有时候在某些地方我们得以看到嵌入式赋值的言语,那些组织不是一个较好的少冗余,可读**赛的方法。

while ($a != ($c = getchar()))
{
process the character
}
++和–操作符类似于赋值语句。因此,出于许多底目的,在采取函数的时会发副作用。使用嵌入式赋值提高运行时**能够是可能的。无论怎样,程序员在动用嵌入式赋值语句时欲考虑于增高的进度以及削减的不过保障**彼此中加以权衡。例如:

a = b + c;
d = a + r;
绝不写成:

d = (a = b + c) + r;

虽后者可以节约一个周期。但当漫漫来拘禁,随着程序的维护费用渐渐增长,程序的编者对代码渐渐淡忘,就会回落在成熟期的极端优化所得。

  1. 扶植与共享

4.1. 用您和其他人的困顿工作

逾工程的录取在尚未一个通用结构的情况下几是免容许的。对象符合他们共处的劳动需要,不同的过程具有不同之劳务要求环境,这如果对象还用变得很窘迫。
出一个通用结构亟待事先花费许多的竭力来计划。当全力以赴不成事的时候,无论由什么原因,有几乎种方法推荐用:

4.2. 请教!给群组发Email求助

此简单的艺术充分少吃下。因为有些程序员们看只要他向其他人求助,会显得自己水平没有,这差不多傻乎乎啊!做新的好玩之干活,不要同全又同样全的做别人就举行过的事物。
比方您要或多或少事项的源代码,如果就发出有人做了的语句,就往群组发email求助。结果碰头充分惊喜哦!
以过剩深之群组中,个人往往不明白其他人在提到啊。你还好发现有人以检索有事物做,并且自愿为您勾勒代码,如果人们在同干活,外面就是到底有一个资源。

4.3. 告诉!当你当工作的时节,把它们报告所有人数

倘您做了什么可选用的物吧,让其他人知道。别害羞,也不要为了维护自豪感而把你的劳作战果藏起来。一旦养成共享工作成果的惯,每个人还见面获更多。

4.4. 小型代码库

对于代码用,一个大面积的问题不怕是众人切莫自她们举行过的代码中做库。一个但选用的切近或刚刚隐藏于一个顺序目录并且不要会出被分享的震动,因为程序员不见面管看似分拆出来加入库中。
这般的其中一个缘故就是众人切莫希罕开一个小库,对小库有一些非科学感觉。把这样的感到克服掉吧,电脑才不体贴而生稍许个仓库呢。
一旦您出有代码可以用,而且未可知放入一个已是的库中,那么尽管举行一个初的库吧。如果人们的确考虑用的话,库不见面在特别丰富之一段时间里保持那么有些的。

4.5. 知识库

众多店铺无知情现有什么代码可用,而且多数程序员仍然没有通过关系他们都举行了了啊,或者直接当摸底现存什么代码可用。解决这的办法是发一个可用之知识库。
出色之情状是,程序员可以到一个WEB页,浏览或者查询打包的知识库列表,找到他们所要之。建立一个程序员可以自动保护的知识库系统,是一个老是的做法。如果产生一个特意的管理员来负担掩护这知识库,那本再好。
任何一样栽方式是全自动的起代码中产生知识库的做法。把通用的切近、方法及标头(subsystem
headers)作为手册或者是知识库的一个章。

  1. 开注释

5.1. 说一个故事

拿您的注释当作描述系统的一个故事。并且让你的笺注能让机器解析后,以稳的格式推广至手册中去。类的笺注是故事之相同局部,方法的称呼、方法的诠释、方法的贯彻啊是故事一样组成部分。所有的这些部分编制在一道,使得人们在事后的日子里克精确的懂得乃关系了啊,为什么这样做。

5.2. 归档注释

注解的设归档才发意义,否则,假如在一个地方放平漫漫注释描述而开了哟选择以及您干什么这么做,只有考古学家才能够觉察及时是太得力的信。(如何归档另行规范)

5.3. 诠释结构

工程的诸有都生一定的注释结构。
程序中之诠释,这里给出示例作为标准,注释中因 * @
为要字之起,以:为注释关键字最后。

5.3.1. 预定义关键字

关键字 含义
Purpose 表示类、属**、方法而召开来什么或者什么含义。
Package Name 类名
Author 作者
Modifications 修改记录(编号规则也“No”+日期+“-”+序号)
See 参考
Method Name 方法名
Parameter 参数号称(包括项目)
Return 返回值(包括项目)
Attribute/Variable Name 属**/变量名
Type 属**/变量类型

5.3.2. 类的注解

/**
* @ Purpose:
* 访问数据库的切近,以ODBC作为通用访问接口
* @Package Name: Database
* @Author: Forrest Gump gump@crtvu.edu.cn
* @Modifications:
* No20020523-100:
* odbc_fetch_into()参数位置第二与老三单职位调换
* John Johnson John@crtvu.edu.cn
* @See: (参照)
*/
class Database
{
……
}

5.3.3. 术注释

/**
* @Purpose:
* 执行同样浅查询
* @Method Name: Query()
* @Parameter: string $queryStr SQL查询字符串
* @Return: mixed 查询返回值(结果集对象)
*/
function($queryStr){……}

5.3.4. 属**要么变量注释

/**
* @Purpose:
* 数据库连接用户称
* @Attribute/Variable Name: mDbUserName
* @Type: string
*/
var mDbUserName;

5.3.5. if (0)来诠释表代码块

偶然需要注释大段的测试代码,最简易的办法就是运用if (0)块:
function example()
{
great looking code

if (0) {
lots of code
}

more code
}
卿切莫克使/**/,因为注释内部未能够包含注释,而大段的次第中好涵盖注释。

5.3.6. 目文档

负有的目录下都亟需持有README文档,其中囊括:
· 该目录的效益及其包含内容
·
一个针对各国一样文件之在线验证(带有link),每一个认证通常还应该提取文件标头的局部属**名字。
· 包括安装、使用验证
· 指导人们怎么连接相关资源:
o 源文件目录
o 在线文档
o 纸文档
o 设计文档
· 其他对读者产生帮助的事物
考虑一下,当每个原有的工人员走了,在6独月之内来之一个新娘,那个孤独受惊吓之探险者通过合工程的源代码目录树,阅读说明文件,源文件之标头说明等等做为地图,他应发生力量穿越所有工程。

  1. 其他

· 采用面向对象的统筹方法;

理由
肯定这是太相近人们自然想的主意,可能前期会认为无直接写来得赶紧,能否试着保留好的见?好戏在后头!

· 类的概念采用一个文本一个类,并且类名和文书称相同;

理由
o 越来越多之总人口接受了这种做法
o 事实证明这种措施教项目的逻辑结构更清晰

· 类定义文件被,定义体之外不得起诸如echo、print等输出语句;

理由
并发如此的语,应该作为出现bug来拘禁。

· 输出网页的页面不起SQL语句

理由
当即是n层结构的编程思想所给,每层的任务不同,虽然好越权行使,可能这样十分高效,但咱无赞成这么干。

· 进行SQL执行的多寡必须开展中**检测

特殊符号:
对于MS SQL Server,’%_[ ]
这些号都是当挥洒SQL语句被之特有意义字符,在SQL执行前需要对这些字符进行拍卖。
剧本符号:
对PHP脚本标记,如<??><%%><?php?><script
lang<script
language=”php”></script>,在登数据库前待检测处理。
理由
即是数据库编程的一个约定,很多参考书上为是这般说,这里需要强调一下。

· 在HTML网页中尽量不要通过插PHP代码

循环代码和纯粹变量输出(类似于<?=$UserName?>)除外。
理由
o
需要征的凡咱做事的上游,页面设计者的干活,假如在页面被过插代码,将坏结构,这当是我们得避免的。
o 以此的PHP代码只负责显示,多余的代码显然是免应该的。

· 没有意义的数字

一个每当源代码中行使了之赤身裸体的数字是不可思议的数字,因为包括作者,在三只月内,没人她的含义。例如:
if (22 == $foo) { start_thermo_nuclear_war(); }
else if (19 == $foo) { refund_lotso_money(); }
else if (16 == $foo) { infinite_loop(); }
else { cry_cause_im_lost(); }
以上例中22及19之意思是啊也?如果一个数字改变了,或者这些数字只是简短的一无是处,你会怎么想?
下不可思议的数字是该程序员是业余选手的重大标志.
公应有为此define()来叫您想表示某样东西的数值一个确实的讳,而未是采取赤裸裸的数字,例如:
define(“PRESIDENT_WENT_CRAZY”, “22”);
define(“WE_GOOFED”, “19”);
define(“THEY_DIDNT_PAY”, “16”);

if (PRESIDENT_WENT_CRAZY == $foo) { start_thermo_nuclear_war(); }
else if (WE_GOOFED == $foo) { refund_lotso_money(); }
else if (THEY_DIDNT_PAY == $foo) { infinite_loop(); }
else { happy_days_i_know_why_im_here(); }
如今休是换得重好了么?

 

  1. PHP文件扩展名

泛的PHP文件之恢宏名有:html, .php, .php3, .php4, .phtml, .inc,
.class…
此间我们约定:

· 所有浏览者可见页面使用.html
· 所有类、函数库文件使用.php

理由

· 扩展名描述的是那种数据是用户用会见吸纳的。PHP是解释为HTML的。

  1. PHP代码标记

集合行使<?php ?>,只输出变量时<?=$username?>

  1. 介绍
    1.1. 标准化的重要**
    法问题在少数方面上叫每个人头痛,让众人都认为豪门处于同一的地步。这促进让这些建议在诸多的型面临连形成,许多供销社花费了重重星期逐子字逐句的进展争论。标准化不是异样的个人风格,它对该地改良是了开放的。
    1.2. 优点
    当一个种类尝试着遵守公用的正统时,会生出以下好处:
    · 程序员可以了解其他代码,弄清程序的场面
    · 新人可长足的适应环境
    · 防止新接触php的人数由于节省时间的需,自创始一效仿风格并养成终生的惯
    · 防止新接触php的丁一次次的犯同样的谬误
    · 在一如既往的条件下,人们可以抽犯错的机会
    · 程序员们产生矣同一的敌人
    1.3. 缺点
    · 因为专业由片免亮php的食指所制定,所以标准便看上去分外傻
    · 因为专业及自身做的不一致,所以标准一般看上去非常笨
    · 标准降低了创造力
    · 标准于长久互相合作的人群遭受是从未必要的
    · 标准强迫太多之格式
    1.4. 讨论
    很多档的阅历会得出这样的下结论:采用编程标准可假设项目越来越顺畅地好。标准是成之重大也?当然不。但其得以拉我们,而且我们需要我们能够得的拥有的帮忙!老实说,对一个细节标准的大部争论主要是根自负思想。对一个靠边的正经的怪少决定能叫说呢是少技术**的说话,那不过是脾胃的案由罢了。所以,要灵活的操纵自负思想,记住,任何类型还在于团队合作之极力。
    1.5. 解释
    1.5.1. 标准实施
    第一应当以出小组的内部找有装有的卓绝要之要素,也许标准对而的现象尚不够恰当。它或许已经席卷了
    重要之问题,也恐怕还有人对中间的少数问题表示强烈的不予。无论在什么动静下,只要最后胜利的讲话,人们将成熟之敞亮到是标准是合理合法之,然后另外的程序员们吧会见发觉她的客观**,并认为带在有些保留去按照这同专业是值得的。如果无自觉的协作,可以制定需求:标准肯定要是通过代码的印证。如果没检查的讲话,这个解决方案只有是一个起以未可靠的底蕴及的相同十分群可笑的人头。
    1.5.2. 认可观点
  2. 立无济于事;
  3. 想必可行吧,但是它既非实用又粗俗;
  4. 立刻是实在,而且自己吗告诉过您啊;
  5. 本条是自先想到的;
  6. 本就是当如此。
    倘你带来在否定的成见而来对事物的话,请而保持开放之盘算。你照可以做出它是废话的下结论,但是做出定论的道就是你必须要能经受不同之构思。请你给协调一点年华错开就它。
    1.5.3. 档次之季只级次
  7. 数据库结构
  8. 设计
  9. 数据层
  10. HTML层

  11. 命名规则

2.1. 适宜的命名

取名是次设计的着力。古人相信只要掌握一个人数实在的名字便会见得过于那个人以上的不可思议的能力。只要你让物想到是的讳,就见面吃你和后来之丁带来比较代码更强的能力。别笑!
名便是物在它所处之生态环境中一个马拉松而意味深长的结果。总的来说,只生了解系统的程序员才能够啊系统取出最宜的讳。如果持有的命名都跟那自然相契合,则关乎清晰,含义可以推导得出,一般人之想也克在预料中。
而你意识你的命名只有为数不多能够及夫针对性诺事物相配合的语句,
最好要再度好好重新省你的规划吧。

2.2. 类命名

· 在啊接近(class
)命名前率先使知其是啊。如果由此类名的供的头脑,你或想不起这个仿佛是啊的言辞,那么你的计划性虽还做的不足够好。
·
超过三单词做的混合名是轻导致系统依次实体间的模糊,再探您的筹划,尝试用(CRC
Session card)看看该命名所对应之实业是否具有那么多之功能。
·
对于派生类的命名该避免带那父类名的引发,一个类似的讳只是同它自己有关,和其的父类叫什么无关。
· 有时后缀名是有效的,例如:如果您的网采用了代办(agent
),那么就将某某部件命名吧“下载代理”(DownloadAgent)用以真正的传递信息。

2.3. 措施与函数命名

·
通常每个方法及函数都是实行一个动作之,所以对它的命名该懂得的印证其是开啊的:用CheckForErrors()代替ErrorCheck(),用DumpDataToFile()代替DataFile()。这么做为堪要效益及多少化再不过分别的体。
· 有时后缀名是立竿见影之:
o Max – 含义吗某个实体所能加之的最好充分价值。
o Cnt – 一个周转着之计数变量的手上价值。
o Key – 键值。
譬如:RetryMax 表示无比多重试次数,RetryCnt 代表手上重试次数。
· 有时前缀名是可行的:
o Is –
含义为咨询一个关于某样事物之问题。无论何时,当众人看Is就会见知道这是一个问题。
o Get – 含义为博得一个数值。
o Set – 含义为设定一个数值
例如:IsHitRetryLimit。

2.4. 缩写歌词毫不全运用非常写字母

·
无论如何,当遇到以下状况,你可以为此首配母大写那余字母小写来替代全部动十分写字母的艺术来表示缩写词。
使用: GetHtmlStatistic.
不使用: GetHTMLStatistic.
理由
·
当命名含有缩略词时,人们似乎具有很例外的直觉。统一确定是太好,这样一来,命名的义就是完全可预知了。
举个NetworkABCKey的事例,注意C是理所应当是ABC里面的C还是key里面的C,这个是非常令人费解的。有些人未上心这些,其他人却异常厌恶这样。所以若会当不同的代码里看看不同的条条框框,使得你无清楚怎么去于其。
例如
class FluidOz // 不要写成 FluidOZ
class GetHtmlStatistic // 不要写成 GetHTMLStatistic

2.5. 类命名

· 使用特别写字母作为词之隔,其他的假名都采取小写
· 名字的首字母使用大写
· 不要使用下划线(‘_’)
理由
· 根据广大之命名方式,大部分总人口觉着这么是极度好的方。
例如
class NameOneTwo
class Name

2.6. 类库命名

·
目前定名空间正在更加广阔的于应用,以避免不同厂商与团伙类库间的类名冲突。
·
当尚未利用命名空间的上,为了避免类名冲突,一般的做法是于类名前增长特殊的前缀,两个字符就足以了,当然多用部分会面再度好。
例如
John Johnson的数据结构类库可以就此Jj做呢前缀,如下:
class JjLinkList
{
}
另外一样种折中艺术是立涵盖类库目录(事实上Java也是这么做的),以堵塞的目代表不同之命名空间。
例如
Microsoft的数据库相关类库可以当:
/classes/com/Microsoft/ Database/DbConn.php
Apache的数据库相关类库可每当:
/classes/org/apache/Database/DbConn.php

2.7. 计命名

· 采用与类似命名一致的条条框框
理由
· 使用有不同规则之绝大多数人口发觉就是极致好之让步办法。
例如
class NameOneTwo
{
function DoIt() {};
function HandleError() {};
}

2.8. 类属**命名

· 属**命名该为字符‘m’为前缀。
· 前缝‘m’后下给类命名一致的规则。
· ‘m’总是以名字的初步起修饰作用,就如因‘r’开头表示援引一样。
理由
·
前缀’m’防止类属**和艺术名出任何冲突。你的方法名和属**何谓经常会面生类似,特别是存取元素。
例如
class NameOneTwo
{
function VarAbc() {};
function ErrorNumber() {};
var $mVarAbc;
var $mErrorNumber;
var $mrName;
}

2.9. 艺术被参数命名

· 第一单字符使用小写字母。
· 在首字符后的有着字都按照类命名规则首字符大写。
理由
· 可以分方法吃的貌似变量。
· 你可以和类名相似之称而不至于发生重名冲突。
例如
class NameOneTwo
{
function StartYourEngines(
&$rSomeEngine,
&$rAnotherEngine);
}

2.10. 变量命名

· 所有字母都应用小写
· 使用’_’作为每个词的交界。
理由
· 通过就无异门路,代码中变量的作用域是清楚的。
· 所有的变量在代码中都看起不同,容易辨别。
例如
function HandleError($errorNumber)
{
$error = OsErr($errorNumber);
$time_of_error = OsErr->GetTimeOfError();
$error_processor = OsErr->GetErrorProcessor();
}

2.11. 援变量和函数返回引用

· 引用得带来‘r’前缀
理由
· 使得项目不同之变量容易辨别
· 它可以规定谁方法返回可转对象,哪个方法返回不可更改对象。
例如
class Test
{
var mrStatus;
function DoSomething(&$rStatus) {};
function &rStatus() {};
}

2.12. 全局变量

· 全局变量应该带前缀‘g’。
理由
· 知道一个变量的作用域是生重大的。
例如
global $gLog;
global &$grLog;

2.13. 定义命名 / 全局常量

· 全局常量用’_’分隔每个单词。
理由
顿时是命名全局常量的风土。你要是留心不要同另的定义相冲突。
例如
define(“A_GLOBAL_CONSTANT”, “Hello world!”);

2.14. 静态变量

· 静态变量应该带前缀‘s’。
理由
· 知道一个变量的作用域是十分主要之。
例如
function test()
{
static $msStatus = 0;
}

2.15. 函数命名

· 函数名下C GNU的老,所有的假名使用小写字母,使用’_’分割单词。
理由
· 这样可重易于区分相关联的类名。
例如
function some_bloody_function()
{
}

2.16. 不当返回检测规则

· 检查有的系统调用的错误信息,除非您而不经意错误。
· 为各国条系统错误信息定义好系统错误文本以便include。

  1. 书写规则

3.1. 大括号 {} 规则

以三种要的大括哀号放置规则中,有个别种植是足以承受的,如下的第一栽是无比好的:
· 将大括如泣如诉放置在根本词下方的与列处:
if ($condition) while ($condition)
{ {
… …
} }
· 传统的UNIX的括号规则是,首括号和主要词同行,尾括号与重大字同列:
if ($condition) { while ($condition) {
… …
} }
理由
·
引起热烈争论之非原则的题材而经过折衷的方化解,两栽方法任意一栽都是可接受的,然而对于绝大多数总人口来说还爱第一种植。原因就是是心理研究上范畴的东西了。
对此再次欣赏第一栽还拥有更多之因。如果你使用的字符编辑器支持括号匹配功能的语(例如vi),最要之饶是发一个吓的体。为什么?我们说当你发出同异常块的程序同时想了解就同样格外块程序是在哪里了的言语。你先易到起的括号,按下按钮编辑器就见面找到与的对应之竣工括号,例如:
if ($very_long_condition && $second_very_long_condition)
{

}
else if (…)
{

}
起一个先后块移动及其它一个主次块就需要因此光标和汝的括号匹配键就可了,不需找匹配的括号。

3.2. 缩进/制表符/空格 规则

· 使用制表符缩进。
· 使用三至四只空格为各个层次缩进。
·
不再用要同有得就是缩排的道。对于极端特别缩进层数,并没有一个原则性的规矩,假如缩进层数大于四要么五层的时段,你可考虑在以代码因数分解(factoring
out code)。
理由
· 许多编程者支持制表符。
· 当人们使用差异太非常之制表符标准吧,会如阅读代码变得死去活来棘手。
·
如此多的食指愿意限定最要命之缩进层数,它一般没有被看成是千篇一律码工作。我们深信程序员们会面明智之选项嵌套的深。
例如
function func()
{
if (something bad)
{
if (another thing bad)
{
while (more input)
{
}
}
}
}

3.3. 小括哀号、关键词和函数 规则

· 不要把小括号与重要词紧贴于联合,要为此空格隔开它。
· 不要把小括号与函数名紧贴于同。
· 除非必要,不要在Return返回语句被使小括号。
理由
·
关键字勿是函数。如果小括号紧贴着函数名为与严重性字,二者很爱给看做是紧紧的。
例如
if (condition)
{
}

while (condition)
{
}

strcmp($s, $s1);

return 1;

3.4. 别在目标架构函数惨遭开实在的办事

变当靶架构构造函数中召开实在的工作,
构造函数应该包含变量的初始化和(或)不会见有失败的操作。
理由
· 构造不可知回到错误 。
例如
class Device
{
function Device() { /* initialize and other stuff */ }
function Open() { return FAIL; }
};

$dev = new Device;
if (FAIL == $dev->Open()) exit(1);

3.5. If Then Else 格式

布局
随即是因为程序员决定。不同的花括号样式会产生若干微不同的样观。一个通用方是:
if (条件1) // 注释
{
}
else if (条件2) // 注释
{
}
else // 注释
{
}
使您出因此到else if
语句的话,通常最有一个else块以用于拍卖不处理及之任何情形。可以的语放一个笔录信息注释在else处,即使在else没有另外的动作。
极格式
连用恒量放在等号/不顶号的左,例如:
if ( 6 == $errorNum ) …
一个因是使你于等式中渗透了一个等号,语法检查器会为汝报错。第二单因是你能立找到数值而未是当你的表达式的后找到它们。需要一些岁月来习惯是格式,但是其的确蛮有因此。

3.6. switch 格式

·
当一个case块处理后,直接改动到下一个case块处理,在此case块的最后应长注释。
· default
case总该在,它应当无被到达,然而一旦到达了就会见接触一个错。
· 如果你要开创一个变量,那就是管持有的代码放在块被。
例如
switch (…)
{
case 1:

// FALL THROUGH
case 2:
{
$v = get_week_number();

}
break;

default:
}

3.7. continue,break 和 ? 的使用

3.7.1. Continue 和 Break
Continue 和 break 其实是变相的藏之 goto方法。
Continue 和 break 像 goto
一样,它们当代码中凡有魔力的,所以如果节俭(尽可能少)的以她。使用了这同一简短的魔法,由于有未公开的来头,读者将会见于定向到只有上帝才知晓之地方去。
Continue有少只举足轻重的题材:
· 它可绕了测试条件。
· 它好绕了当/不等表达式。
看下面的例子,考虑一下问题且于何处来:
while (TRUE)
{

// A lot of code

if (/* some condition */) {
continue;
}

// A lot of code

if ( $i++ > STOP_VALUE) break;
}
顾:”A lot of
code”是要的,这是为了为程序员们未克那么好的摸来荒谬。
透过上述之例子,我们可得出更进一步的规则:continue 和 break
混合使用是挑起灾难的没错方法。
3.7.2. ?:
麻烦在于人们频繁试着在 ? 和 :
之间塞满了诸多底代码。以下的凡局部鲜明的连日规则:
· 把标准放在括号内为要它和任何的代码相分离。
· 如果可能吧,动作好就此简易的函数。
· 把所开的动作,“?”,“:”放在不同的履,除非他们得知道的厕同一行。
例如
(condition) ? funct1() : func2();

or

(condition)
? long statement
: another long statement;

3.8. 声明块的稳

· 声明代码块需要对合。
理由
· 清晰。
· 变量初始化的近乎代码块当列表。
· &应贴近类型,而非是变量名。
例如
var $mDate
var& $mrDate
var& $mrName
var $mName

$mDate = 0;
$mrDate = NULL;
$mrName = 0;
$mName = NULL;

3.9. 每行一个讲话

只有这些报告句有大仔细的联系,否则每行只写一个语。

3.10. 短方法

主意代码要界定以同样页内。

3.11. 笔录有的空语句

连年记录下for或者是while的空块语句,以便了解的明亮该段代码是脱了,还是成心不写的。

while ($dest++ = $src++)
; // VOID

3.12. 决不使用缺省方法测试不零值

决不用缺省值测试不零值,也即是下:

if (FAIL != f())
正如脚的计好:

if (f())

即 FAIL 可以涵盖 0 值
,也不怕是PHP认为false的代表。在某人决定用-1代替0作为黄返回值的下,一个显式的测试就可帮忙您了。就算是比较值未会见转移吧相应下显式的较;例如:if
(!($bufsize % strlen($str)))应该写成:if (($bufsize % strlen($str)) ==
0)以代表测试的数值(不是布尔)型。一个常产生问题之地方就是是使strcmp来测试一个字符等式,结果永远为无见面等缺省值。
莫零测试用基于缺省值的做法,那么其他函数或表达式就会见遭以下的限定:
· 只能回到回0表示失败,不可知吧/有另外的价值。
·
命名以便为一个着实(true)的返回值是绝对显然的,调用函数IsValid()而不是Checkvalid()。

3.13. 布尔逻辑类型

大部函数在FALSE的时光回来回0,但是达非0值就表示TRUE,因而不用用1(TRUE,YES,诸如此类)等式检测一个布尔值,应该用0(FALSE,NO,诸如此类)的不等式来代表:

if (TRUE == func()) { …
应当写成:

if (FALSE != func()) { …

3.14. 常见避免嵌入式的赋值

有时候在一些地方我们得以看到嵌入式赋值的说话,那些组织不是一个比好之少冗余,可读**赛的措施。

while ($a != ($c = getchar()))
{
process the character
}
++和–操作符类似于赋值语句。因此,出于许多的目的,在应用函数的时会发副作用。使用嵌入式赋值提高运行时**能够是可能的。无论怎样,程序员在运嵌入式赋值语句时要考虑以提高的进度以及减少的而保障**两岸中加以权衡。例如:

a = b + c;
d = a + r;
绝不写成:

d = (a = b + c) + r;

虽然后者可以省去一个周期。但当遥远来拘禁,随着程序的维护费用渐渐增长,程序的编者对代码渐渐淡忘,就见面减少在成熟期之顶优化所得。

  1. 援以及共享

4.1. 录取您和其他人的不方便工作

超过工程的选用在无一个通用结构的状下几是休容许的。对象符合他们共处的服务要求,不同的进程具有不同之劳动需要环境,这只要对象还用变得非常不方便。
付出一个通用结构需要事先花费许多之着力来统筹。当全力以赴不成功的时节,无论由什么来头,有几种植方法推荐下:

4.2. 请教!给群组发Email求助

本条简单的法充分少吃采取。因为有些程序员们认为只要他往其他人求助,会来得融洽水平没有,这基本上傻乎乎啊!做新的妙趣横生的劳作,不要同不折不扣又同样布满的开别人就做了的东西。
假若你用一些事项的源代码,如果都起某个人开了之言语,就往群组发email求助。结果碰头老惊喜哦!
在群可怜的群组中,个人往往无懂得其他人在涉及啊。你甚至足以发现有人当寻觅有东西做,并且自愿为你写代码,如果人们以合干活,外面就是到底有一个宝藏。

4.3. 告诉!当您于办事的时刻,把它们报告所有人

如果你做了呀但选用的事物的话,让其他人知道。别害羞,也决不为保障自豪感而将您的劳作成果藏起来。一旦养成共享工作成果的习惯,每个人且见面得更多。

4.4. 小型代码库

对于代码用,一个宽广的题目不怕是人们不由她们举行了之代码中做库。一个而选用的好像可能刚刚隐藏在一个顺序目录并且永不会时有发生于分享的激动,因为程序员不会见管看似分拆出来参加库中。
这样的中间一个由即是众人切莫希罕做一个小库,对小库有一对休科学感觉。把这样的感到克服掉吧,电脑才不体贴你发微微个仓库呢。
比方你生有代码可以选用,而且未可知放入一个就是的库中,那么尽管举行一个新的库吧。如果人们的确考虑录用的话,库不会见以很丰富的一段时间里保持那么小的。

4.5. 知识库

森号无明了现有什么代码可用,而且大多数程序员仍然没有通过联系他们已经举行过了啊,或者直接当摸底现存什么代码可用。解决这的方式是有一个可用之知识库。
精良之事态是,程序员可以到一个WEB页,浏览或者查询打包的知识库列表,找到她们所要之。建立一个程序员可以自动保护的知识库系统,是一个不行是的做法。如果来一个专门的管理员来顶住维护这知识库,那当然再好。
另一样种植方式是半自动的起代码中出知识库的做法。把通用的切近、方法以及标头(subsystem
headers)作为手册或者是知识库的一个条条框框。

  1. 书写注释

5.1. 说一个故事

拿你的注释当作描述系统的一个故事。并且让你的笺注能为机器解析后,以一贯的格式推广至手册中去。类的笺注是故事的同等部分,方法的名目、方法的注解、方法的贯彻为是故事一样局部。所有的这些有些编制在联名,使得人们在以后的时刻里克规范的晓乃关系了啊,为什么这样做。

5.2. 归档注释

注解的使归档才来意义,否则,假如在一个地方放平长条注释描述而开了哟选择以及汝为何这么做,只有考古学家才能够觉察及时是极实用的信。(如何归档另行规范)

5.3. 诠释结构

工程的诸有都发生一定的注释结构。
程序中之诠释,这里给出示例作为标准,注释中因 * @
为要字之始发,以:为注释关键字最后。

5.3.1. 预定义关键字

关键字 含义
Purpose 表示类、属**、方法而召开来什么要什么含义。
Package Name 类名
Author 作者
Modifications 修改记录(编号规则为“No”+日期+“-”+序号)
See 参考
Method Name 方法名
Parameter 参数名叫(包括项目)
Return 返回值(包括项目)
Attribute/Variable Name 属**/变量名
Type 属**/变量类型

5.3.2. 类的注解

/**
* @ Purpose:
* 访问数据库的切近,以ODBC作为通用访问接口
* @Package Name: Database
* @Author: Forrest Gump gump@crtvu.edu.cn
* @Modifications:
* No20020523-100:
* odbc_fetch_into()参数位置第二跟老三个职务调换
* John Johnson John@crtvu.edu.cn
* @See: (参照)
*/
class Database
{
……
}

5.3.3. 法注释

/**
* @Purpose:
* 执行同一次于查询
* @Method Name: Query()
* @Parameter: string $queryStr SQL查询字符串
* @Return: mixed 查询返回值(结果集对象)
*/
function($queryStr){……}

5.3.4. 属**还是变量注释

/**
* @Purpose:
* 数据库连接用户称
* @Attribute/Variable Name: mDbUserName
* @Type: string
*/
var mDbUserName;

5.3.5. if (0)来诠释表代码块

偶然用注释大段的测试代码,最简单易行的不二法门就是是运if (0)块:
function example()
{
great looking code

if (0) {
lots of code
}

more code
}
汝不能够下/**/,因为注释内部未能够包含注释,而大段的次第中可涵盖注释。

5.3.6. 目录文档

拥有的目下还要持有README文档,其中包括:
· 该目录的效用及其包含内容
·
一个针对性各级一样文本的在线验证(带有link),每一个认证通常还应该提取文件标头的片属于**名字。
· 包括安装、使用说明
· 指导人们怎样连接相关资源:
o 源文件目录
o 在线文档
o 纸文档
o 设计文档
· 其他对读者出协助的物
考虑一下,当每个原有的工人员活动了,在6只月里来的一个新人,那个孤独受惊吓之探险者通过合工程的源代码目录树,阅读说明文件,源文件的标头说明等等做为地图,他当发生能力穿越所有工程。

  1. 其他

· 采用面向对象的规划方式;

理由
得这是最最相仿人们当然想的方法,可能前期会以为没有直接开来得抢,能否试着保留好之观?好戏在后面!

· 类的概念采用一个文书一个看似,并且类名和文书称相同;

理由
o 越来越多之人头收受了这种做法
o 事实证明这种措施使得项目的逻辑结构还清晰

· 类定义文件中,定义体之外不得起诸如echo、print等输出语句;

理由
起这么的言辞,应该当出现bug来拘禁。

· 输出网页的页面不出新SQL语句

理由
及时是n层结构的编程思想所给予,每层的天职不同,虽然足越权行使,可能这样很迅猛,但咱不同情这么干。

· 进行SQL执行的数量要开展实用**检测

特殊符号:
对于MS SQL Server,’%_[ ]
这些号都是在题SQL语句被之特有意义字符,在SQL执行前需要对这些字符进行拍卖。
剧本符号:
对此PHP脚本标记,如<??><%%><?php?><script
lang<script
language=”php”></script>,在登数据库前待检测处理。
理由
立刻是数据库编程的一个预定,很多参考书上吧是这么说,这里需要强调一下。

· 在HTML网页中尽量不要通过插PHP代码

循环代码和纯粹变量输出(类似于<?=$UserName?>)除外。
理由
o
需要征的是咱办事的上游,页面设计者的办事,假如在页面被穿插代码,将坏结构,这当是我们要避免的。
o 以此间的PHP代码只当显示,多余的代码显然是勿应有的。

· 没有意思的数字

一个以源代码中运用了底赤身裸体的数字是不可思议的数字,因为包括作者,在三独月内,没人她的意义。例如:
if (22 == $foo) { start_thermo_nuclear_war(); }
else if (19 == $foo) { refund_lotso_money(); }
else if (16 == $foo) { infinite_loop(); }
else { cry_cause_im_lost(); }
当上例中22暨19之含义是呀吧?如果一个数字改变了,或者这些数字只是简短的荒谬,你会怎么想?
采用不可思议的数字是该程序员是业余选手的要紧标志.
而当用define()来让您想表示某样东西的数值一个着实的名字,而无是使用赤裸裸的数字,例如:
define(“PRESIDENT_WENT_CRAZY”, “22”);
define(“WE_GOOFED”, “19”);
define(“THEY_DIDNT_PAY”, “16”);

if (PRESIDENT_WENT_CRAZY == $foo) { start_thermo_nuclear_war(); }
else if (WE_GOOFED == $foo) { refund_lotso_money(); }
else if (THEY_DIDNT_PAY == $foo) { infinite_loop(); }
else { happy_days_i_know_why_im_here(); }
当今不是更换得又好了么?

 

  1. PHP文件扩展名

普遍的PHP文件的恢弘名有:html, .php, .php3, .php4, .phtml, .inc,
.class…
这边我们约定:

· 所有浏览者可见页面使用.html
· 所有类、函数库文件使用.php

理由

· 扩展名描述的是那种数据是用户将会接的。PHP是说明吗HTML的。

  1. PHP代码标记

合并使用<?php ?>,只输出变量时<?=$username?>

相关文章