服务器 频道

PHP编码规范(中)

  【IT168 服务器学院】3. 书写规则

  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;

  虽然后者可以节省一个周期。但在长远来看,随着程序的维护费用渐渐增长,程序的编写者对代码渐渐遗忘,就会减少在成熟期的最优化所得。

0
相关文章