* PHP编码规范
* 本文档参照wordpess编码标准, 部分被作者改进
* By Roberson - 2012.05.19
* 索引
1. 单双引号
2. 空格
3. 格式化SQL语句
4. 命名约定
5. 正则表达式
6. 三元运算符
7. 使程序语义简明
8. 建议使用elseif, 而不是else if
9. 书写HTML代码时, 确保遵循W3C规范
10. 混编时PHP代码与html的部分适当错开
11. 书写css时, 遵循CSS的编写标准
12. 在纯php脚本的文件中, 省略php脚本的闭合标签
*/
1. 单双引号
1.1 // 当字符串中不需要计算任何值时使用单引号
echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';
1.2 // 当字符串中需要计算值时使用双引号, 你不需要使用转义符, 因为可以使用下面这种形式
echo "<a href='$link' title='$linktitle'>$linkname</a>";
// 关于变量被单双引号包围的情况说明:
通常情况, 变量直接被双引号包围时, 是会被解析为值的
变量直接被单引号包围时, 不会被解析为值,
$a = "yangzheng";
$str1 = "$a";
$str2 = '$a';
echo $str1.",".$str2 // output: yangzheng,$a
但是特殊的情况是, 单双引号互相嵌套时, 如:
$str3 = "'$a'"; // output: yangzheng
$str4 = '"$a"'; // output: "$a"
要注意这种情况, 变量是否被解析为值取决于表达式最外层的符号
当最外层是单引号时, 变量不被解析为值, 当最外层是双引号时, 变量被解析为值
//
$a = "yangzheng";
$str = "this is '{$a}'"; // output this is 'yangzheng'
定界符的基本用法是确保变量名的作用域总是在定界符内,但是不能保证使用了定界符之后,定界符内的变量一定会不解析为值。比如上面的$str3 = '"{$a}"'; 这里的$a就不会被解析为值。一种典型的需要使用定界符的情况是这样:
$arr = array(
"0" => array("id"=>"12", "name"=>"asd"),
"1" => array("id"=>"121", "name"=>"1asd"),
);
$str = "";
foreach ($arr as $v) {
$str .= "<a>{$v['id']}</a>";
// 不加{}的情况下识别$v为变量, 后面的['id']为普通字符串, 由于$v是数组因此这里直接报错了。
}
echo $str;
2. 空格
2.1 使用空格的目的
适当使用空格是为了使代码更容易被阅读
当需要换行时, 使用Tab键而不是空格键来创建一个"空格"
$a = "value";
$arr = array();
// 数组在键名之前加一个tab, 一个键值对写完之后回车,
键值对的格式统一为: [Tab键]键名[空格键]=>[空格键]键值, (最后一个键值对不要去逗号)
$arr = array(
"key1" => "value1",
"key2" => "value2",
"key3" => "value3",
);
2.2 空格的使用, 这里的空格指的是由空格键产生的空格
if (condition) {
action1();
action2();
} elseif (condition2 && condition3) {
action3();
action4();
} else {
defaultaction();
}
// if行的格式统一为:
if[空格键]([空格键]表达式[空格键])[空格键] {
即使表达式内的语句只有一条, 仍然坚持使用大括号将他们包围
与次类似的还有:
foreach ($items as $item) {
process_item( $item );
}
foreach ($items as $item) {
echo "aaa";
}
switch ($s) {
case 'a':
action1();
break;
case 'b':
action2();
break;
case 'c':
action3();
break;
default:
action4();
//break;
}
for ($i=1; $i<=$n; $i++) {
$action1();
...
}
2.3 不要使用短标记
2.4 空格的其他用法
$x == 23
foo && bar
!$foo
array(1, 2, 3)
$baz . '-5'
$term .= 'X'
str_replace( $str, 2, '2');
2.5 关于空格的补充说明
// 括号和参数之间何时加空格, 何时不加空格
不管是用在什么地方, for ($parameter), if ($parameter), foreach ($parameter), switch ($parameter),
function myfunction($p1, $p2, ) {}
myfunction($p1) ...
原则是这样的:
两个或两个以上的参数之间, 总是用空格隔开逗号和下一个参数;
使用空格总是为了使参数和结构体之间产生一定的距离, 便于阅读者能一目了然地分清楚哪些是结构体, 哪些是参数/表达式
在程序结构清晰的前提下, 尽可能少得往程序中添加空格,
如果参数不是复合结构的表达式, 如 $bool = "$a==$b";等, 只是单纯的变量名这种形式,不在参数和括号之间加空格;
if ($bool) {} switch ($bool) { }...
for ($i=1; $i<=$n; $i++) {
$action1();
}
当参数是复合结构的表达式时, 在适当的地方加上空格, 如:
if ($bool = ($a==$b) ),
if ( ($a==$b) )
strpos($haystack, $needle);
$H = array_shift( explode(':', $fdTime) );
if ( !$foo ) {}
3. 格式化SQL语句
$wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_title=%s WHERE ID...") )
sql语句中的关键字部分一律大写化, 如CREATE, INSERT, WHERE, ORDER BY 等
4. 命名约定
4.1 变量名称可以使用驼峰命名法/下划线命名法, 建议使用驼峰命名法,
特征是: 第一个单词小写, 后续单词大写开头, 简写的单词全部大写, 如:
$keyID, $listsArr, $configDbArr,
$key_id, $lists_arr, $config_db_arr,
// 选择其中一种, 并保持命名的统一
4.2 函数名称一律小写, 不要使用驼峰命名法, 使用下划线命名法
set_shop_categories_arr() {} //设置商品分类的数组
4.3 所有类的名称一律首字母大写, 仍然使用下划线连接
class Walker_Categeory extends Walker {}
4.4 缩略语全部大写化
class WP_HTTP {}
4.5 文件名一律小写化, 并且使用的是 中划线/下划线/点 连接
my-plugin-name.php
my_plugin_name.php
my.plugin.name.php
// 选择其中一种, 并保持命名的统一
4.6 对于具有特定特征的文件, 使用特征名称和点号来命名文件, 如:
class.wp.error.php
template.index.htm
5. 正则表达式
应该使用符合POSIX的perl兼容的正则表达式,使用preg_replace_callback,不要使用/e开关.
6. 三元运算符
// (if statement is true) ? (do this) : (else, do this);
$musictype = ( 'jazz' == $music ) ? 'cool' : 'blah';
// (if field is not empty ) ? (do this) : (else, do this);
7. 使程序语义简明
使用
if ( !isset($var) ) {
$var = some_function();
}
而不是,
isset($var) || $var = some_function();
8. 建议使用elseif, 而不是else if,
9. 书写HTML代码时, 确保遵循W3C规范
10. 混编时PHP代码与html的部分适当错开
使用
if ($bool) {
<div>
<table>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
</table>
</div>
}
而不是,
if ($bool) {
<div>
<table>
<tr><td></td></tr>
<tr><td></td></tr>
<tr><td></td></tr>
</table>
</div>
}
11. 书写css时, 遵循CSS的编写标准
12. 在纯php脚本的文件中, 省略php脚本的闭合标签
不书写php脚本的闭合标签("?>"), 是为了防止出现, 程序员不小心在闭合标签后面加了空格或者其他字符时, 程序编译出现异常的情况.