纠结的PHP编码规范

php的编码规范向来比较混乱,比如变量及函数的命名有的采用骆驼命令法,有的采用下划线命名法,还有的采用匈牙利命名法,不同的系统、不同的框架可能会采用不同的命令方法,比如Zend Framework采用的是骆驼命令法,Zend Framework是少有的我见过的编码非常规范的系统,看起来很惬意,爽心悦目,而康盛的系统比如Discuz!采用的是下划线命名法,看起来也非常舒服。

其实用什么编码不重要,重要的是编码风格在你所有的代码中均保持一致,这样别人来维护你的代码的时候可以少费些工夫。

我最羡慕的是JAVA中有比较规范的编码规范,清一色是采用骆驼命名法,你看看JAVA的api就可以看出来。

1.Discuz!的编码规范分析
include/common.inc.php
a.PHP变量
变量名各单词间采用_连接的方式
$discuz_starttime = $mtime[1] + $mtime[0];

b.PHP常量
php常量采用大写字母,同时各个单词之间用_连接
define('SYS_DEBUG', FALSE);
define('IN_DISCUZ', TRUE);

c.类中的命名规范
include/gifmerge.class.php
类中的成员变量
如果成员变量是由多个单词组成,则各个单词之间用_分开
var $use_loop            = false;
var $transparent        = false;
var $use_global_in        = false;

类名
class GifMerge {

类中的方法
构造函数与类名一致
function GifMerge($images, $t1, $t2, $t3, $loop, $dl, $xpos, $ypos, $model) {

普通的方法
function start_gifmerge_process($fp) {

include/chinese.class.php
类中的成员变量
如果成员变量是由多个单词组成,则各个单词之间用_分开
var $table = '';
var $iconv_enabled = false;
var $convertbig5 = false;
var $unicode_table = array();

类名
class Chinese {

类中的方法
构造函数与类名一致
function Chinese($SourceLang, $TargetLang, $ForceTable = FALSE) {

普通的方法
其实也是没有规律的,有的方法名有_,有的方法名没有_,所以也不是绝对规范的。
function OpenTable() {
function CHSUtoUTF8($c) {
function Utf8_Unicode($char) {

d.数据库命名
表名采用各个单词之间用_连接的方式
字段名各个单词之间混在一起,不用_进行连接
Create TABLE cdb_access (
  uid mediumint(8) unsigned NOT NULL DEFAULT '0',
  fid smallint(6) unsigned NOT NULL DEFAULT '0',
  allowview tinyint(1) NOT NULL DEFAULT '0',
  allowpost tinyint(1) NOT NULL DEFAULT '0',
  allowreply tinyint(1) NOT NULL DEFAULT '0',
  allowgetattach tinyint(1) NOT NULL DEFAULT '0',
  allowpostattach tinyint(1) NOT NULL DEFAULT '0',
  adminuser mediumint(8) unsigned NOT NULL DEFAULT '0',
  dateline int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (uid,fid),
  KEY listorder (fid,dateline)
) TYPE=MyISAM;

2.我理想中的PHP编码规范
变量、函数、关联数组的键值、类中的成员变量、方法均采用骆驼命名法,常量全部采用大写,各个单词之间用_连接,类名采用大写字母开头,每个单词的首首母均大写,比如SmartyProduct。

现在说说让我纠结的命名规范问题:
a.数据库字段名与变量命名规范冲突的问题
我一般在设计数据库的字段名时采用各个单词之间采用_分开,比如app_name、app_description,现在假设要实现添加应用、编辑应用的功能,我们要设计一个form,为了与数据库中的字段名称一致,form的名称与数据库的字段名称一致是最佳方案了,这样一一对应更加便于开发。

form 提交以后,最方便的取变量值的方式就是extract($_REQUEST, EXTR_OVERWRITE),这样变量$app_name、及$app_descriptioin就是名称为app_name、 app_description的form的值了。方便是方便了,但是违背了上面变量的命名规范,应该是采用骆驼命名法的,现在却变成下划线命名法了,对此,有时我有点纠结。其实也有解决方法,循环处理一下就可以。

比如定义如下的一个函数,就可以将app_name转换为appName,将app_name_great转换为appNameGreat
function convertName($field) {
    $fields = explode('_', $field);
    $front = array_shift($fields);

    $otherFields = str_replace(' ', '', ucwords(implode(' ', $fields)));

    return $front . $otherFields;
}
$field = 'app_name';
echo convertName($field) . l;
$field = 'app_name_great';
echo convertName($field) . l;

$_REQUEST = array('app_name' => 'music', 'app_description' => 'This is music channel');
foreach ($_REQUEST as $key => $val) {
    $varName = convertName($key);
    ${$varName} = $val;
}
echo 'appName:' . $appName . l;
echo 'appNameDescription:' . $appDescription . l;

appName:music
appNameDescription:This is music channel

也可以直接给变量赋值
$appName = $_REQUEST['app_name'];
$appDescription = $_REQUEST['app_description'];

纠结的问题又来了,变量的命名规范解决了,但是往数据库中保存时sql语句看起来会很别扭,字段名是下划线命名法,后面的值是骆驼命名法。

$sql = insert into app('app_name', 'app_description') values('$appName', '$appDescription');

b.数组的键值与变量命名规范冲突的问题
按照命名规范,数组的键值应该采用骆驼命名法,但是有时候采用下划线命名法更加方便合理。

比如定义个类
class Template {
      public function __construct($param = '') {
              $this -> obj = new Smarty($param);
              ...
              ...
      }
}

传递给类Template的参数最终是要传递给Smarty来处理的,但是由于smarty采用的是下划线命名法,所以纠结的问题来了。

比如按照命名规范写个调用的例子:
$param = array(
    'templateDir' = '/data/wwwroot/templates',
    'compileDir' = '/data/wwwroot/templates_c'
);
$tpl = new Tempate($param);

问题来了,类smarty中的成员变量采用的是下划线命名法,将参数传递给类Template以后,还需要处理一下,否则无法对应上。

$this -> obj -> template_dir = $param['templateDir'];
$this -> obj -> compile_dir = $param['compiledir'];

如果传递给类Template的数组中有十个值,那一一处理岂不是要用很多重复的代码

所以最好的方式是这样传递参数
$param = array(
    'template_dir' = '/data/wwwroot/templates',
    'compile_dir' = '/data/wwwroot/templates_c'
);
$tpl = new Tempate($param);
foreach ($param as $key => $val) {
    $this -> obj -> $key = $val
}
这样就方便多了。

还有一些,就不一一说了,总之,要找到总合适的处理方式,要在编码规范及方便性之间找到一个平衡点,没有绝对规范的编码,只要尽最大努力把编码写得更加规范,这些是我们可以做到的。

朋友们,你的代码写得规范吗?如果不规范,以后尽量把代码写得更加规范一点,慢慢形成习惯,对自己、对公司、对别人都有好处的。



上一篇: 淘宝前端开发关键词
下一篇: PHP中addslashes及stripslashes的用法
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: php
相关日志:
评论: 0 | 引用: 0 | 查看次数: 1776
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑