我的规范 - PHP规范

命名

  • 变量,全局函数,以及类的公共方法都用小写驼峰分词。

    //错的
    $user_name = '小红';
    $UserName = '小红';
    $Add_Time = 111;
    	
    //对的
    $userName = '小红';
    $addTime = 111;
    	
    	
    //错的
    function GetName(){}
    public function GetXXX(){}
    	
    //对的
    function getName(){}
    public function getUserInfo(){}
    
  • 类的私有属性,方法都在命名前加下划线。

    //错的
    private $name;
    private $parseName(){}
    protected $parseUrl(){}
    	
    //对的
    private $_name;
    private $_parseName(){}
    protected $_parseUrl(){}
    
  • 在模板里计算产生的变量和函数也要加下划线开头命名,以防误代码量大时阅读起来以为是注册进来的变量。

  • 常量全大写下划线分词

    define('ADMIN_EMAIL', 'xxx@umelook.com')
    class User{
    	const MAX_AGE = 200;   //类常量也是全大写下划线分词
    }
    
  • 数组下标小写下划线分词

    这里注意的是,由客户端发起GET/POST请求提交的参数命名用小写陀峰命名,所以$_POST$_GET两个全局数组的下标是陀峰的。

    $aData = [
    	'user_name' => 'xxx',
    	'add_time' => 123,
    ];
    	
    $_POST = [
    	'userName' => 'xxx',
    	'addTime' => 123,
    ];
    
  • 类名用大写开头的陀峰

    class User{}	//一个词
    class CookieCollection{}	//二个词
    
  • 类的文件名前缀和类名一致

    User类就是User.php

    Login类就是Login.php

  • url上的get参数前面的片段全部要小写中划线分词,而GET参数的命名则是小写陀峰命名。

    http://xxx.com/path/userInfo.html?user_id=1&pageSize=10 错误

    http://xxx.com/path/user-info.html?userId=1&pageSize=10 正确


使用原则

  • 表示 是/否 逻辑的变量用true/false

    //错误的:
    $isBoy = 1;
    if($user['sex'] == User::SEX_GIRL){
    	$isBoy = 0;
    }
    
    //正确的:
    $isBoy = true;
    if($aUser['sex'] == User::SEX_GIRL){
    	$isBoy = false;
    }
    
  • 接收前端表示是/否的0/1时要转换成true/false

    $isSave = Yii::$app->request->post('isSave') ? true : false;
    //或者
    $isSave = (bool)Yii::$app->request->post('isSave');
    
  • 非特殊情况下不允许使用全局变量$GLOBALS

  • 用于保存数组内容的变量初始化时如果要设置默认值则用 [ ]

  • 禁止将变量放在双引号的字符串里面,像这样"姓名:$sName"是不允许的。

  • 如果字符串里面带有单引号则可以变通一下,使用'What\'s your name'或者"What's your name"都行。


备注

基本上使用phpdoc备注格式书写备注,如果在Yii2框架中,则增加以下备注规范:

  • 说明一个常量是事件名称

    当一个类有const EVENT_BEFORE_LOGIN = 'before_login'的常量时,如果这个常量用在这样的代码中:

    $class->on(MyClass::EVENT_BEFORE_LOGIN, function(){...});
    

    说明这个常量就是一个事件标识,则这个常量需要基于phpdoc规范来扩展描述它的作用,配合定义的位置这样写备注:

    /**
     * @event 这里是事件的介绍,比如 登陆前的事件
     */
    const EVENT_BEFORE_LOGIN = 'before_login';
    
  • 说明明一个函数/方法的作者时,@author可以不输入邮箱,直接写姓名标记即可。

    /**
     * 退出登陆
     * @author 小明
     */
    public function logout(){
    	
    }
    
  • 说明一个方法有没有编写单元测试时,增加@test来标注,值是单元测试用例的类名(带命名空间)和方法。

    /**
     * 退出登陆
     * @author 小明
     * @test \tests\UserTestSuite::testLogout
     */
    public function logout(){
    	
    }