资源描述
PHP语言编写规范
第1章 命名规范
1.1变量
1.1.1全局变量
全局变量使用$g_开头,如$g_data_list。
1.1.2 普通变量
普通变量使用小写字母命名,单词之间使用下划线分隔。
变量名字应当使用名词或者形容词+名词方式。如$value,$new_value。
1.1.3 暂时变量
不要将在循环中频繁使用暂时变量如$i,$j等用于其他用途。
1.2 函数
函数采用小写字母命名,单词之间使用下划线分隔。
函数命名建议使用动词+名词方式,如get_user_img。
完毕一组功能函数放到一种文献中,存储函数文献采用function_name.func.php命名。
1.3 类
类使用英文大小写来分隔单词,涉及首个单词,所有单词首字母大写,如PageManager;
在类中,办法放到属性定义前边、公用办法放到专用办法前边;
普通状况下,一种类相应到一种文献;
当某些类关系紧密时,可以存储在一种文献中;
存储类文献采用ClassName.class.php方式命名。
1.4 办法
办法使用英文大小写来分隔单词,除首个单词外,其她单词首字母大写,如getCurrentPage();
不要采用不惯用缩写,如where2go();
使用惯用缩写时,只大写首字母,如getHtml()。
第2章 版式规则
2.1 语义分隔
各个函数、办法之间应当采用空行间隔;
同一种函数中联系紧密语句之间可以不换行,其她状况需要换行。
2.2 空格规则
2.2.1 逻辑运算符先后必要加空格
对的 $a == $b;
错误 $a==$b;
$a ==$b;
备注 -
对的 $a++;$a–;
错误 $a ++;$a –;
备注 加一减一运算符不能加空格。
2.2.2 各种参数分隔时必要加空格
对的 $g_pro ,$g_user ,g_show;
get_db_info($host,$user,$passwd);
错误 $g_pro,$g_user,$g_show;
get_db_info($host,$user,$passwd);
备注 -
2.2.3 语法核心字后必要加空格
例如:If,for ,while,switch …..
对的 for ($i = 0;$i < 10;$i++)
错误 for($i = 0;$i < 10;$i++ )
备注 -
2.3 字符串和变量连接规则
字符串与变量连接使用’.'号时,必要在’.'先后加空格,使用”号时,必要在变量先后加”{}”。
对的 $my_name = ’file_’ . $var1;
$my_name = ”file_{$var1}”;
错误 $my_name = ”file_’.$var1;
$my_name = ”file_$var1″;
备注 -
2.4 圆括号规则
函数名后括号不需要加空格、语法核心字后括号必要加空格。
对的 for ($i = 0;$i < 10;$i++)
strlen($my_name);
错误 for($i = 0;$i < 10;$i++ )
strlen ($my_name);
备注 -
2.5 花括号规则
花括号必要为上下相应。
对的
if ($a)
{
$b = $a;
}
错误 if ($a){
$b = $a;
}
备注 -
2.6 数组定义规则
数组定义和使用时中key值先后必要加单引号。
PHP 代码:
下载:php_array.php
<?php
//对的
array(
'name' => '',
'gender' => 'php'
);
//错误
array(
name => '',
gender => 'php'
);
?>
2.7 SQL规则
在PHP中嵌入SQL语句核心字所有采用大写;
表名和字段名要用反引号(`)引起来以防止由于字段名中包括空格而浮现错误;
数据值两边用单引号”涉及,并且应保证数据值中单引号已经转义以防止SQL注入。
对的 $sql = ”SELECT `user`.`name` FROM `user` WHERE `id` = ’$id’ LIMIT 1″;
错误 $sql = ”select name.user from name where id = $id ”;
备注 -
第3章 注释规则
3.1 普通规则
不写不必要注释;只有当代码不能较好地阐明逻辑时,才用注释补充;
把注释当作程序一某些,在编写/维护代码时同步编写/维护注释;
注释完全采用PHPDocumentor规范,以以便用其生成API级文档。
3.2 详细规则
请参见PHPDocumentor手册。下边给出各个某些注释示范。
3.2.1 版权信息
注释名称 版权信息
注释示范 //
// +—————————————————-+
// | phpDocumentor |
// +—————————————————-+
// | Copyright (c) - Joshua Eichorn |
// | Email |
// | Web |
// +—————————————————-+
// | This source file is subject to PHP License |
// +—————————————————-+
//
备注 使用//来标示版权信息,以免和PHPDocumentorpage-level DocBlock发生冲突
3.2.2文献头注释示例
注释名称 文献头注释
注释示范
下载:php_doc.php
<?php
* All abstract representations of inline tags are in this file
* @package phpDocumentor
* @subpackage InlineTags
* @since separate file since version 1.2
* @version $Id $
*/
?>
备注
1 文献头注释需要指明所属包和子包
2 在@version中加上$ID,以以便使用CVS管理文献
3.2.3 类注释示例
注释名称 类注释
注释示范
下载:php_class.php
<?php
/**
* Use this element to represent an {@}inline tag} like {@}link}
* @see parserStringWithInlineTags
* @package phpDocumentor
* @subpackage InlineTags
* @author Greg Beaver <></>
* @since 1.0rc1
* @version $Revision:1.21.2.6 $
* @tutorial inlinetags.pkg
*/
?>
备注 -
3.2.4 类属性注释示例
注释名称 类属性注释
注释示范
下载:php.php
<?php
/** var $type = 'inlinetag';
* Element type
*
* Type is used by many functions to skip the hassle of
*
* <code>
* if get_class($blah) == 'parserBlah'
* </code>
* always "inlinetag"
* @var string
*/
?>
备注 -
3.2.5 函数/类办法注释示例
注释名称 函数/类办法注释
注释示范
下载:php.php
<?php
/** function getString() '';
* @return string always ''
* calculate the short description of a DocBlock
* @see parserStringWithInlineTags::getString()
* @see parserStringWithInlineTags::trimmedStrlen()
*/
{
return
}
?>
此条目刊登在 理论 分类目录。将固定链接加入收藏夹。
用单引号代替双引号来包括字符串,这样做会更快某些。由于PHP会在双引号包围字符串中搜寻变量,单引号则不会,注意:只有echo能这样做,它是一种可以把各种字符串当作参数“函数”(译注:PHP手册中说echo是语言构造,不是真正函数,故把函数加上了双引号)。
1、如果能将类办法定义成static,就尽量定义成static,它速度会提高将近4倍。
2、$row[’id’] 速度是$row[id]7倍。
3、echo 比 print 快,并且使用echo多重参数(译注:指用逗号而不是句点)代替字符串连接,例如echo $str1,$str2。
4、在执行for循环之前拟定最大循环数,不要每循环一次都计算最大值,最佳运用foreach代替。
5、注销那些不用变量特别是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文献时尽量使用绝对途径,由于它避免了PHP去include_path里查找文献速度,解析操作系统途径所需时间会更少。
9、如果你想懂得脚本开始执行(译注:即服务器端收到客户端祈求)时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10、函数代替正则表达式完毕相似功能。
11、str_replace函数比preg_replace函数快,但strtr函数效率是str_replace函数四倍。
12、如果一种字符串替代函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替代代码,使得每次传递参数是一种字符,而不是只写一行代码接受数组作为查询和替代参数。
13、使用选取分支语句(译注:即switch case)好于使用各种if,else if语句。
14、用@屏蔽错误消息做法非常低效,极其低效。
15、打开apachemod_deflate模块,可以提高网页浏览速度。
16、数据库连接当使用完毕时应关掉,不要用长连接。
17、错误消息代价昂贵。
18、在办法中递增局部变量,速度是最快。几乎与在函数中调用局部变量速度相称。
19、递增一种全局变量要比递增一种局部变量慢2倍。
20、递增一种对象属性(如:$this->prop++)要比递增一种局部变量慢3倍。
21、递增一种未预定义局部变量要比递增一种预定义局部变量慢9至10倍。
22、仅定义一种局部变量而没在函数中调用它,同样会减慢速度(其限度相称于递增一种局部变量)。PHP大概会检查看与否存在全局变量。
23、办法调用看来与类中定义办法数量无关,由于我(在测试办法之前和之后都)添加了10个办法,但性能上没有变化。
24、派生类中办法运营起来要快于在基类中定义同样办法。
25、调用带有一种参数空函数,其耗费时间相称于执行7至8次局部变量递增操作。类似办法调用所耗费时间接近于15次局部变量递增操作。
26、Apache解析一种PHP脚本时间要比解析一种静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制普通可以提高25%至100%性能,以免除编译开销。
28、尽量做缓存,可使用memcached。memcached是一款高性能内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)缓存很有用,使得脚本不必为每个祈求做重新编译。
29、当操作字符串并需要检查其长度与否满足某种规定期,你想固然地会使用strlen()函数。此函数执行起来相称快,由于它不做任何计算,只返回在zval 构造(C内置数据构造,用于存储PHP变量)中存储已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,由于函数调用会通过诸多环节,如字母小写化(译注:指函数名小写化,PHP不区别函数名大小写)、哈希查找,会跟随被调用函数一起执行。在某些状况下,你可以使用isset() 技巧加速执行你代码。
(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”$$ }
(与下面技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”$$ }
调用isset()碰巧比strlen()快,由于与后者不同是,isset()作为一种语言构造,意味着它执行不需要函数查找和字母小写化。也就是说,事实上在检查字符串长度顶层代码中你没有花太多开销。
34、当执行变量$i递增或递减时,$i++会比++$i慢某些。这种差别是PHP特有,并不合用于其她语言,因此请不要修改你C或Java代码并指望它们能及时变快,没用。++$i更快是由于它只需要3条指令(opcodes),$i++则需要4条指令。后置递增事实上会产生一种暂时变量,这个暂时变量随后被递增。而前置递增直接在原值上递增。这是最优化解决一种,正如ZendPHP优化器所作那样。紧记这个优化解决不失为一种好主意,由于并不是所有指令优化器都会做同样优化解决,并且存在大量没有装配指令优化器互联网服务提供商(ISPs)和服务器。
35、并不是事必面向对象(OOP),面向对象往往开销很大,每个办法和对象调用都会消耗诸多内存。
36、并非要用类实现所有数据构造,数组也很有用。
37、不要把办法细分得过多,仔细想想你真正打算重用是哪些代码?
38、当你需要时,你总能把代码分解成办法。
39、尽量采用大量PHP内置函数。
40、如果在代码中存在大量耗时函数,你可以考虑用C扩展方式实现它们。
41、评估检查(profile)你代码。检查器会告诉你,代码哪些某些消耗了多少时间。Xdebug调试器包括了检查程序,评估检查总体上可以显示出代码瓶颈。
42、mod_zip可作为Apache模块,用来即时压缩你数据,并可让数据传播量减少80%。
43、在可以用file_get_contents代替file、fopen、feof、fgets等系列办法状况下,尽量用file_get_contents,由于她效率高得多!但是要注意file_get_contents在打开一种URL文献时候PHP版本问题;
44、尽量少进行文献操作,虽然PHP文献操作效率也不低;
45、优化Select SQL语句,在也许状况下尽量少进行Insert、Update操作(在update上,我被恶批过);
46、尽量使用PHP内部函数(但是我却为了找个PHP里面不存在函数,挥霍了本可以写出一种自定义函数时间,经验问题啊!);
47、循环内部不要声明变量,特别是大变量:对象(这好像不只是PHP里面要注意问题吧?);
48、多维数组尽量不要循环嵌套赋值;
49、在可以用PHP内部字符串操作函数状况下,不要用正则表达式;
50、foreach效率更高,尽量用foreach代替while和for循环;
51、用单引号代替双引号引用字符串;
52、“用i+=1代替i=i+1。符合c/c++习惯,效率还高”;
53、对global变量,应当用完就unset()掉;
展开阅读全文