8. 函数
8.1. 接口函数参数的合法性检查
函数参数的合法性检查应由函数的调用者负责,接口函数做必要性合法性检查(不强制)。
总结为:以外为主,以内为辅,内部不强制。
8.2. 函数规模
函数的规模限制在100行以内,不包括注释和空格行。
8.3. 一个函数仅完成一件功能
8.4. 不要设计多用途面面俱到的函数
除调度函数外,多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难
8.5. 多段代码重复同一件事情
如果多段代码重复做同一件事情,那么在函数的划分上可能存在问题。若此段代码各语句之间有实质性关联并且是完成同一件功能的,那么可考虑把此段代码构造成一个新的函数。
9. 质量保证
9.1. 兼容性
9.2. 三元运算符
三元运算符,在一行代码里只允许使用一级
三元运算符只应该用来做简单的事情。它们只适合拿来做赋值用,根本不是用来做函数调用或者任何复杂的事情的。如果使用不当,它们会影响可读性,所以不要沉迷于使用它们来减少打字。
示例:不应该使用它们的地方
(($i < $size) && ($j > $size)) ? do_stuff($foo) : do_stuff($bar);
示例:使用它们的合适地方$min = ($i < $j) ? $i : $j;
9.3. 初始化变量
变量使用前应初始化,error_reporting 将加入 E_NOTICE。意味着,变量未初始化将报错。这个问题最容易在检查 HTML 表单传递了什么变量时出现。这些错误可以通过使用内嵌的 isset() 或者empty()函数检查一个变量是否被设置来避免。
示例: 老办法
if ($forum) ...
新办法:if (!empty($forum)) ...
if (isset($forum)) …
9.4. 引用字符串
在 PHP 中有两种不同的方式引用字符串——使用单引号或使用双引号。主要区别是:解析器在双引号括起的字符串中执行变量替换,却不在单引号括起的字符串中执行。因此,应当始终使用单引号,除非你确实需要对字符串进行变量替换。这样,我们可以避免让解析器解析一堆不需要执行替换的字符串的麻烦。同样,如果你使用字符串变量作为函数调用的一部分,你不需要用引号把那个变量括起来。同样,那只会给解析器增加不必要的工作。无论如何,要注意几乎所有双引号中的转义序列在单引号中都不会起作用。如果这条规范使你的代码难以阅读的话,要小心,并且放心地打破它。
示例:如下例子不符合规范
复制代码 代码如下:
$str = "This is a really long string with no variables for the parser to find.";
do_stuff("$str");
应如下书写:
复制代码 代码如下:
$str = 'This is a really long string with no variables for the parser to find.';
do_stuff($str);
当由于可读性的原因不得不使用双引号作为引用符时,注意其中所有的变量需用{}包围:$str = " This is '{$what}' with no variables for the parser to find."
9.5. 关联数组的键名
在 PHP 中,使用一个不用引号括起来的字符串作为一个关联数组的键名是可以运行的。我们不想这样做——为了避免混乱,这个字符串应当用引号括起来。注意,这只是当我们使用字符串时的情况,不是当我们使用变量时的情况。示例:如下例子不符合规范
$foo = $assoc_array[blah];
应如下书写:
$foo = $assoc_array['blah'];
9.6. 简化运算符
简化自增($i++)和自减($i--)运算符是导致可读性问题的仅有的简化运算符。这些运算符不应当被用作表达式的一部分。然而,他们可以独占一行使用。在表达式中使用它们(带来的便利)还不够调试时头痛的(代价)。
示例:如下例子不符合规范
复制代码 代码如下:
$array[++$i] = $j;
$array[$i++] = $k;
应如下书写:$i++;
$array[$i] = $j;
$array[$i] = $k;
$i++;
9.7. if 以及else if的写法
当条件语句中的条件存在多个,并且有变量值的判断的时候,需要把变量的判断语句放在其他的条件语句之前。
示例:如下例子不符合规范
复制代码 代码如下:
if (function_exists(‘ob_gzhandler') && $val == 1){
}
应如下书写:if ($val == 1 && function_exists(‘ob_gzhandler')){
}
虽然在 PHP 中else if 和 elseif 的作用基本上是一样的。但是为了代码的统一性(也有传言 else if 会出现不稳定的情况),我们要求将 elseif 之间不保留空格:if ($bool == 2){
}elseif ($n = 1){
}
9.8. 输入变量的初始化
无论是函数的参数还是通过URL传递的变量,在调用之前均必须对其进行预处理以及设定默认值。