自己写的PHP代码总是感觉很乱

写代码的时候,总是1个方法里把全部逻辑都实现了,修改的时候写了注释,自己都晕头转向, 一点都没有用到面向对象,怎么样才能精简自己的代码,看上去思路清晰,一目了然,请教大神指条明路!下面是代码

public function qqLogin(){

    $appid = C('APPID');
    $openid = I('openid');
    $accesstoken = I('accesstoken');
    $pid = I('pid');
    $url = "https://graph.qq.com/user/get_user_info?access_token=".$accesstoken."&oauth_consumer_key=".$appid."&openid=".$openid;

// 获取QQ用户详细信息

    $result = $this->http_curl($url);
    $User = M('users');
    if($result['ret'] == 0){

// QQ注册,查看是否注册过了

        $userRes = M('user_auths')->where(array('identity_type'=>'qq','identifier'=>$openid))->find();
        if(!$userRes)
        {
            $User->startTrans(); //开启事物
//            添加到users表
            $userdata['phone'] = 0;
            $res_user_uid = $User->add($userdata);
//            添加到user_auth表
            $userAuth['user_id'] = $res_user_uid;
            $userAuth['identity_type'] = 'qq';
            $userAuth['identifier'] = $openid;
            $userAuth['credential'] = $accesstoken;//第三方登陆的openid
            $userAuth['token'] = $this->create_token();//第三方登陆的access_token
            $userAuth['login_time'] = time();
            $userAuth['pid'] = $pid;//客户端推送的唯一ID
            $res_user_auths = M('user_auths')->add($userAuth);
            if($res_user_auths && $res_user_uid){
                $User->commit(); //如果两张表都添加成功 执行事物 添加操作
                $res = $User->where(array('id'=>$res_user_uid))->field('nickname,avatar,id')->find();
                $code = 1;
                $msg = '查询成功';
                $data['uId'] = $res['id'];
                if($res['nickname'] != "")
                {
                    $data['uName'] = $res['nickname'];    
                }
                if($res['avatar'] != "")
                {
                    $data['uIc'] = $res['avatar'];
                }
                if($res['phone'] != 0)
                {
                    $data['uTel'] = $res['phone'];
                }
                $data['uToken'] = M('user_auths')->where(array("id"=>$res_user_auths))->getField('token');
                echoMsg($code, $msg, $data); 
            }else
            {
                $User->rollback(); //事物回滚
            }
        
        }else{

// 登陆时 获取新的token值

                $token = $this->create_token();
                M('user_auths')->where(array("id"=>$userRes['id']))->save(array('token'=>$token,'login_time'=>time(),'pid'=>$pid));

// 返回数据信息

                $res = $User->where(array('id'=>$userRes['user_id']))->field('nickname,avatar,id')->find();
                $code = 1;
                $msg = '查询成功';
                $data['uId'] = $res['id'];
                if($res['nickname'] != "")
                {
                    $data['uName'] = $res['nickname'];    
                }
                if($res['avatar'] != "")
                {
                    $data['uIc'] = $res['avatar'];
                }
                if($res['phone'] != 0)
                {
                    $data['uTel'] = $res['phone'];
                }
                $data['uToken'] = M('user_auths')->where(array('id'=>$userRes['id']))->getField('token');
                echoMsg($code, $msg, $data);
        }
    }else{
            $code = 90001;
            $msg = '登陆失败';
            echoMsg($code, $msg);
    }

} 
阅读 4.4k
3 个回答

这是个不断成长的过程,没有代码是标准的,代码好不好看有一部分是主观感觉,所以需要给评价优质代码这件事上定一些原则。我的代码原则是:

  1. 可自由扩展,尽可能降低耦合,不论需求有多细小

  2. 可配置,可通过设置config改变程序行为

  3. 容易交接给其他程序员,至少自己可以通过口述或者文档,很容易地让别的程序员理解你的代码

每当写代码也要注意以上的原则,每次都可以得到提高。

在目前的开源系统中,我接触过的开源架构最漂亮扩展能力最好的是magento2,你下载来参考一下它的代码做法,多读代码就更多了解组织代码的手段。

关于具体的代码优化,你也可以留言给我进行讨论。


自由扩展,降低耦合比较抽象,就像中医所说的固本培元一样抽象。一个比较新鲜的解决方案是依赖注入,可以参考symfony的依赖注入,参考于Java,目的就是降低类与类之间的依赖性,可以看看以下简单例子
https://my.oschina.net/cxz001...


看你发的代码,是简单的代码段,说不上有什么问题,不过有点小冗余,一部分可以改善下。

if($res['nickname'] != "")
{
    $data['uName'] = $res['nickname'];    
}
if($res['avatar'] != "")
{
    $data['uIc'] = $res['avatar'];
}
if($res['phone'] != 0)
{
    $data['uTel'] = $res['phone'];
}

因为这三段行为是一样的,行为一样应该把这个行为组织为函数

function if_empty($var1, $var2) {
    if(empty($var1) || $var1 == 0) return $var2;
    return $var1;
}

$res['uName'] = if_empty($res['nickname'], $res['uName']);
$res['uIc'] = if_empty($res['uIc'], $res['avatar']);
$res['uTel'] = if_empty($res['uTel'], $res['phone']);

命名上也是有很讲究的,直观的命名比注释更好地理解程序行为。我以上的命名不算好。

看到php辣眼睛代码太多了 能想到把代码写好说明有上进心的 完全受不了那些靠着混工作经验还想着涨工资的

下面进入正题 想要把代码写好首先建议看几遍PSR规范 让自己代码遵循规范会看起来更舒服 然后感觉有写重复的代码就想想办法怎么能把它们提取出来放到一个你认为合理的地方 还有一些函数很长或者嵌套很多层的 把你认为能提取出来起一个合理的函数名的代码提取出来放到一个单独的函数 经过这几步以后 你的代码应该已经相当具有可读性了 接下来想要更上一层楼你就要去深入的理解像MVC这些架构模式以及类的一些基本概念 之后看一看关于设计模式的书 每次写代码都尽量去做到完美 随着时间的积累 相信你的代码会越来越好

多看看人家写的代码

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题