最新消息:欢迎加入小松的QQ群一起讨论一起学习,服务器快到期了,新买了台服务器,最近要做服务器迁移

php开发规范

PHP 1347浏览 0评论

php开发规范可以让程序员可以了解任何代码,弄清程序的状况;新人可
以很快的适应环境;防止新接触php的人一次次的犯同样的错误;在一致的开发环境下,
可以减少人们犯错的机会

标准化的重要

标准化问题在某些方面上让每个人头痛,让人人都觉得大家处于同样的境地。这有助于让这些建议在许多的项目中不断演进,许多公司花费了许多星期逐子字逐句的进行争论。标准化不是特殊的个人风格,它对本地改良是完全开放的。

PHP 闭合标签

PHP闭合标签“?>”在PHP中对PHP的分析器是可选的。 但是,如果使用闭合标签,任何由开发者,用户,或者FTP应用程序插入闭合标签后面的空格都有可能会引起多余的输出、php错误、之后的输出无法显示、空白页。因此,所有的php文件应该省略这个php闭合标签,并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。这样有利于你确定这个文件已经结束而不是被删节的。

不当的:
<?php

echo "Here's my code!";

?>

适当的:
<?php

echo "Here's my code!";

/* End of file myfile.php */
/* Location: ./system/modules/mymodule/myfile.php */

类和方法(函数)的命名规则

类名的首字母应该大写。如果名称由多个词组成,词之间要用下划线分隔,不要使用骆驼命名法。类中所有其他方法的名称应该完全小写并且名称能明确指明这个函数的用途,最好用动词开头。尽量避免过长和冗余的名称

不当的:
class superclass
class SuperClass

适当的:
class Super_class
class Super_class {

function __construct()
{

}
}

不当的和适当的方法名称的示例:

不当的:
function fileproperties() // 方法名没有清晰的描述以及下划线分割单词
function fileProperties() // 方法名没有清晰的描述以及使用了驼峰法命名
function getfileproperties() // 还可以!但是忘记了下划线分割单词
function getFileProperties() // 使用了驼峰法命名
function get_the_file_properties_from_the_file() // 方法名太冗长

适当的:
function get_file_properties() // 清晰的方法名描述,下划线分割单词,全部使用小写字母

变量命名

变量的命名规则与方法的命名规则十分相似。就是说,变量名应该只包含小写字母,用下划线分隔,并且能适当地指明变量的用途和内容。那些短的、无意义的变量名应该只作为迭代器用在for()循环里。

不当的:
$j = 'foo'; // 单字符变量应该只作为for()的循环变量使用
$Str // 使用了大写字母
$bufferedText // 使用了驼峰命名,而且变量名应该更短,并有清晰的语法含义
$groupid // 多个词组,应该使用下划线分割
$name_of_last_city_used // 太长了
适当的:
for ($j = 0; $j < 10; $j++)
$str
$buffer
$group_id
$last_city

注释

通常,代码应该被详细地注释。这不仅仅有助于给缺乏经验的程序员描述代码的流程和意图,而且有助于给你提供丰富的内容以让你在几个月后再看自己的代码时仍能很好的理解。 注释没有强制规定的格式,但是我们建议以下的形式。

文档块(DocBlock) 式的注释要写在类和方法的声明前,这样它们就能被集成开发环境(IDE)捕获:

/**
 * Super Class
 *
 * @package Package Name
 * @subpackage Subpackage
 * @category Category
 * @author Author Name
 * @link http://example.com
 */
class Super_class {
/**
 * Encodes string for use in XML
 *
 * @access public
 * @param string
 * @return string
 */
function xml_encode($str)

使用行注释时,在大的注释块和代码间留一个空行。

// break up the string by newlines
$parts = explode("\n", $str);
// A longer comment that needs to give greater detail on what is
// occurring and why can use multiple single-line comments. Try to
// keep the width reasonable, around 70 characters is the easiest to
// read. Don't hesitate to link to permanent external resources
// that may provide greater detail:
//
// http://example.com/information_about_something/in_particular/
$parts = $this->foo($parts);

常量

常量命名除了要全部用大写外,其他的规则都和变量相同。在适当的时候,始终使用CodeIgniter常量,例如LASH, LD, RD, PATH_CACHE等等.

不当的:
myConstant // 未使用下划线分割单词,未全部使用大写字母
N // 不能使用单个字母作为常量
S_C_VER // 常量名没有清晰的含义
$str = str_replace('{foo}', 'bar', $str); // should use LD and RD constants
恰当的:
MY_CONSTANT
NEWLINE
SUPER_CLASS_VERSION
$str = str_replace(LD.'foo'.RD, 'bar', $str);

TRUE, FALSE, 和 NULL

TRUE, FALSE, 和 NULL 关键字应该总是完全大写的。

不当的:
if ($foo == true)
$bar = false;
function foo($bar = null)
恰当的:
if ($foo == TRUE)
$bar = FALSE;
function foo($bar = NULL)

逻辑操作符

|| 有时让人底气不足,不容易辨识,因为在某些输出设备上它不够清晰(可能看起来像数字11). && 要优先于 AND ,不过两者都可以被接受, 使用 ! 时要在其前后都加一个空格。

不当的:
if ($foo || $bar)
if ($foo AND $bar) // 可以,但有时不被常用的语法程序高亮推荐(高亮标识)
if (!$foo)
if (! is_array($foo))
恰当的:
if ($foo OR $bar)
if ($foo && $bar) // 推荐
if ( ! $foo)
if ( ! is_array($foo))

比较返回值与类型映射

部分PHP函数执行失败时返回 FALSE, 但也可能有一个有效的返回值 “” 或 0, 它在松散比较中会被计算为FALSE. 在条件语句中使用这些返回值的时候,为了确保返回值是你所预期的类型而不是一个有着松散类型的值,请进行显式的比较。

在返回和检查你自己的变量时也要遵循这种严格的方法,必要时使用=== 和 !==。

不当的:
// 如果 'foo' 位于此字符串的起始处,strpos将返回 0,
// 此处条件判断的结果为TRUE
if (strpos($str, 'foo') == FALSE)
恰当的:
if (strpos($str, 'foo') === FALSE)
不当的:
function build_string($str = "")
{
 if ($str == "") // uh-oh! 如果传递的参数是FALSE或者整数0那会怎么样?
 {
 }
}
恰当的:
function build_string($str = "")
{
 if ($str === "")
 {
 }
}

文件中的空格

在PHP开始标记之前和结束标记之后都不能有空格。在下面的例子中,使用鼠标选中这些文本,你就能看到那些不应该有的空格。

不当的:
 <?php
 // ...在PHP开始标记上面有空格和换行符
 // 并且在PHP结束标记后面也有空格
 ?>
 恰当的:
<?php
 // 本例中,PHP开始标记之前和结束标记之后就没有空格
 ?>

使用常见词语来命名类和文件

当你的类或文件名是一个常见词语时,或者是很可能与另一个PHP脚本同名时,使用一个唯一的前缀来避免冲突。你必须始终明白这一点:你的最终用户可能会运行其它第三方的附加组件或者PHP脚本。选择一个能够唯一标识开发者或公司的前缀

不当的:
class Email pi.email.php
class Xml ext.xml.php
class Import mod.import.php
恰当的:
class Pre_email pi.pre_email.php
class Pre_xml ext.pre_xml.php
class Pre_import mod.pre_import.php

代码缩进

使用 Allman 风格缩进。除了类声明以外,括号总是独占一行,且缩进与“属于”它的控制语句同级。

不恰当的:
function foo($bar) {
// ...
}

foreach ($arr as $key => $val) {
// ...
}

if ($foo == $bar) {
// ...
} else {
// ...
}

for ($i = 0; $i < 10; $i++)
{
for ($j = 0; $j < 10; $j++)
{
// ...
}
}

恰当的:
function foo($bar)
{
// ...
}

foreach ($arr as $key => $val)
{
// ...
}

if ($foo == $bar)
{
// ...
}
else
{
// ...
}

for ($i = 0; $i < 10; $i++)
{
for ($j = 0; $j < 10; $j++)
{
// ...
}
}

方括号及圆括号内的空格符

通常情况下,不要在方括号”[]”和圆括号”()”内增加任何空格符。唯一的例外就是为了提高可读性和区别开它们与函数,在接受参数的PHP语法控制结构所使用的括号里,需要增加空格符(declare, do-while, elseif, for, foreach, if, switch, while)。

不恰当的:
$arr[ $foo ] = 'foo';

正确的:
$arr[$foo] = 'foo'; // 数组键值的方括号内没有空格
不恰当的:
function foo ( $bar )
{

}

正确的:
function foo($bar) // 函数声明的圆括号内没有空格
{

}
不恰当的:
foreach( $query->result() as $row ) // PHP语法控制结构之后有空格,但不是在圆括号内

正确的:
foreach ($query->result() as $row)

短标记

一直使用 PHP 完整标记,以免服务器不支持短标记,也就是未打开 short_open_tag 。(IT不倒翁注释:这条已经不成立,因为新版本的 CI 已经解决了服务器不支持短标记的问题,不过还是建议使用完整标记)

不正确的:
<? echo $foo; ?>

<?=$foo?>

正确的:
<?php echo $foo; ?>

每行一条语句

切记不要在一行写多条语句

不正确:
$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);

正确:
$foo = 'this';

$bar = 'that';

$bat = str_replace($foo, $bar, $bag);

字符串

一直使用单引号除非你需要解析变量(Jacklee注:CI核心代码未严格遵循此规范),如果需要解析变量请使用大括号, to prevent greedy token parsing. 如果字符串包含单引号的话你可以使用双引号,这样就不用转义了。

INCORRECT:
"My String" // 没有解析变量,不需要使用双引号
"My string $foo" // 解析变量需要使用括号
'SELECT foo FROM bar WHERE baz = \'bag\'' // 需要转义单引号''时这样写比较难看,可以使用双引号
CORRECT:
'My String'
"My string {$foo}"
"SELECT foo FROM bar WHERE baz = 'bag'"

SQL 查询

MySQL的关键词都是大写: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN, 等。

考虑到易读性,把长的查询分成多行,最好是每行只有一个从句或子从句。

不正确的: //
 关键词是小写并且一行中的查询太长(...表示行的继续)
 $query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses ...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100"); 
正确的: 
$query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz
 FROM exp_pre_email_addresses
 WHERE foo != 'oof'
 AND baz != 'zab'
 ORDER BY foobaz
 LIMIT 5, 100");

缺省函数参数

适当的时候,提供函数参数的缺省值,这有助于防止因错误的函数调用引起的PHP错误,另外提供常见的备选值可以节省几行代码 例如:

function foo($bar = '', $baz = FALSE)
QQ交流群:136351212

如无特别说明,本站文章皆为原创,若要转载,务必请注明以下原文信息:
转载保留版权:小松博客» php开发规范
本文链接地址:https://www.phpsong.com/59.html

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
木有头像就木有JJ!点这里按步骤申请Gravatar头像吧!

网友最新评论 (2)

加载中,请稍候...
  1. 开发规范很多,不一定要按照这个来
    小妮2年前 (2015-01-27)回复
    • 这里只是给个参考
      小松2年前 (2015-01-27)回复