当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » PHP  » Web编程
分享到: 
收藏 +0
2
个人理解:
所谓优雅编程就是喝着咖啡,摸着键盘,想着业务;
优雅代码的定义是:
1、尽可能的少单双引号;
2、不要嵌套;
3、命名全是最基本的英语单词;
4、代码像英文一样,是一段一段的;
5、一个应用代码组织调理清晰,最好是树关系,网关系少用。

下边是一个sql查询的连贯操作实现方法,请大家指导指导!
标签: EQPHP PHP MySQL

源码与演示:源码出处 演示出处

代码片段(1) [全屏查看所有代码]

1. [代码]为媛用IDE自动格式化后的缩进代码     跳至 [1] [全屏预览]

<?php

/**
 * DB连贯操作、sql条件构造
 * From: EQPHP FrameWork
 * Author: art_youth
 * E-mail: 258122391@qq.com
 * Pub data: 2012-11-09

 */

class query{

    public $sql='';
    public $option=array();
    static $keyword=array('select','from','where','group','having','order','limit');


    //初始化查询参数
    function __construct($table,$prefix=''){
        $this->option['from']=$prefix.$table;
    }


    //构造参数
    function __call($method,$param){
        if (in_array($method,self::$keyword)) {
            $this->option[$method]=$param[0];
            return $this;
        }
    }


    //输出查询结果
    function out($mode='sql',$rs_count=0,$now_page=1,$page_size=20){
        $this->sql='';
        foreach (self::$keyword as $key) {
            $value=($key == 'group' || $key == 'order') ? $key.' by' : $key;

            if ($key === 'where' && is_array($this->option['where'])) {
                $this->option['where']=self::condition($this->option['where']);
            }

            if (isset($this->option[$key]) && trim($this->option[$key])) {
                $this->sql.=' '.$value.' '.trim($this->option[$key]);
            }

            unset($this->option[$key]);
        }
        $this->sql=trim($this->sql);

        switch($mode){
        case 'rs':
            return db::rs($this->sql);
        case 'list':
            return db::rs_list($this->sql);
        case 'page':
            return db::page_list($this->sql,$rs_count,$now_page,$page_size);
        default:
            return $this->sql;
        }
    }


    //构造sql查询条件
    static function condition($data){
        //处理逻辑连接符
        $logic=' and ';
        if (isset($data['logic'])) {
            $logic=' '.$data['logic'].' ';
            unset($data['logic']);
        }

        //处理字符串(本生sql)
        if (isset($data['query'])) {
            $condition[]='('.$data['query'].')';
            unset($data['query']);
        }

        //处理条件数据
        foreach ($data as $key=>$value) {
            $condition[]='('.self::parse_expression($key,$value).')';
        }

        return implode($logic,$condition);
    }


    //解析表达式
    private static function parse_expression($key,$value){
        if (is_numeric($value)) return $key.'='.$value;
        if (is_string($value)) return $key.'="'.$value.'"';

        if (is_array($value)) {
            //基本条件查询
            if (preg_match('/^(eq|neq|gt|egt|lt|elt)$/i',$value[0])) {
                is_string($value[1]) && $value[1]='"'.$value[1].'"';
                $operator=array('eq'=>'=','neq'=>'<>','gt'=>'>','egt'=>'>=','lt'=>'<','elt'=>'<=',);
                return $key.$operator[$value[0]].$value[1];
            }

            //in范围查找
            if (in_array($value[0],array('in','not in'))) {
                is_array($value[1]) && $value[1]=implode(',',$value[1]);
                return $key.' '.$value[0].'('.$value[1].')';
            }

            //between区间查找
            if (in_array($value[0],array('between','not between'))) {
                $param=is_string($value[1]) ? explode(',',$value[1]) : $value[1];
                return $key.' '.$value[0].' '.$param[0].' and '.$param[1];
            }

            //like模糊匹配
            if (in_array($value[0],array('like','not like'))) {
                if (is_array($value[1])) {
                    $buffer=array();
                    foreach ($value[1] as $param) {
                        $buffer[]=$key.' '.$value[0].' "'.$param.'"';
                    }
                    $logic=isset($value[2]) ? ' '.$value[2].' ' : ' or ';
                    return implode($logic,$buffer);
                }

                if (strpos($key,'|') !== false) {
                    $buffer=array();
                    foreach (explode('|',$key) as $field) {
                        $buffer[]='('.$field.' '.$value[0].' "'.$value[1].'")';
                    }
                    return implode(' or ',$buffer);
                }

                if (strpos($key,'&') !== false) {
                    $buffer=array();
                    foreach (explode('&',$key) as $field) {
                        $buffer[]='('.$field.' '.$value[0].' "'.$value[1].'")';
                    }
                    return implode(' and ',$buffer);
                }


                return $key.' '.$value[0].' "'.$value[1].'"';
            }

            //数学区间查询(1,9)/[2,3)
            if ($value[0] === 'extent') {
                $logic=isset($value[2]) ? ' '.$value[2].' ' : ' && ';
                $operator=array('('=>'>','['=>'>=',')'=>'<',']'=>'<=');
                preg_match('/^(\(|\[)(.*),(.*)(\)|\])$/',$value[1],$param);
                $result='';
                isset($param[2]) && $result.=$key.$operator[$param[1]].$param[2];
                isset($param[4]) && $result.=$logic.$key.$operator[$param[4]].$param[3];
                return $result;
            }

            return '';
        }
    }


    //资源回收
    function __destruct(){
        unset($this->option,$this->sql);
    }


}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(64)

  • 1楼:苏大泉 发表于 2014-02-18 16:47 回复此评论
    你描述的是dsl
  • 2楼:苏大泉 发表于 2014-02-18 16:47 回复此评论
    你描述的是dsl
  • 3楼:art_youth 发表于 2014-02-18 16:52 回复此评论

    引用来自“苏大泉”的评论

    你描述的是dsl
    dsl是什么啊?大傻论?
  • 4楼:练打字的 发表于 2014-02-18 16:56 回复此评论
    没有缩进,感觉乱七八糟的
  • 5楼:art_youth 发表于 2014-02-18 16:59 回复此评论

    引用来自“cgf986916”的评论

    没有缩进,感觉乱七八糟的
    呵呵,多多谢建议,本人已习惯机器式阅读,需要缩进的麻烦用phpstrom或相关IDE自动格式化一下,谢谢。
  • 6楼:SeeSea 发表于 2014-02-18 17:43 回复此评论

    引用来自“cgf986916”的评论

    没有缩进,感觉乱七八糟的
    楼主说这是个错误的示范
  • 7楼:练打字的 发表于 2014-02-18 17:55 回复此评论

    引用来自“SeeSea”的评论

    引用来自“cgf986916”的评论

    没有缩进,感觉乱七八糟的
    楼主说这是个错误的示范
    有可能,通眼一看,没发现是个类,看不清楚有几个方法,if判断没有段落看着头疼死,我居然把if和for给弄混了...别人要是看的话,还得格式化,svn的话,说不定还得提交...
  • 8楼:cfrs2005 发表于 2014-02-18 18:17 回复此评论
    被楼主的注解 震惊了

    最基本的
    /*
    *    @param
    *   @desc
    *   @author
    */

    等等诸多
  • 9楼:Solowave 发表于 2014-02-18 20:01 回复此评论
    没觉得优雅
  • 10楼:老陌 发表于 2014-02-18 21:11 回复此评论
    劳烦楼主不要毁我大PHP程序猿的声誉。。
  • 11楼:art_youth 发表于 2014-02-18 21:48 回复此评论

    引用来自“cfrs2005”的评论

    被楼主的注解 震惊了

    最基本的
    /*
    *    @param
    *   @desc
    *   @author
    */

    等等诸多
    哈哈,和大多数人一样,被惯性束缚着,代码只是辅助,本类来自发布的eqphp框架。 鄙人认为不必要的注释纯属多余,不过也感谢指教。
  • 12楼:art_youth 发表于 2014-02-18 21:51 回复此评论

    引用来自“Solowave”的评论

    没觉得优雅
    代码是最低层的实现级工具类,讲求的是实用,不谈优雅; 要说绝对优雅,只能是看接口编程了,具体实现级别很难做到优雅! 请发表优雅的概念和优雅的代码!
  • 13楼:art_youth 发表于 2014-02-18 21:55 回复此评论

    引用来自“老陌”的评论

    劳烦楼主不要毁我大PHP程序猿的声誉。。
    劳烦楼主理解本文的用意,莫万物皆拙或作短接取义或只看评论发表观点。 期待@老陌的真实见解和优雅代码! 谢谢参与!
  • 14楼:art_youth 发表于 2014-02-18 22:03 回复此评论

    引用来自“cgf986916”的评论

    引用来自“SeeSea”的评论

    引用来自“cgf986916”的评论

    没有缩进,感觉乱七八糟的
    楼主说这是个错误的示范
    有可能,通眼一看,没发现是个类,看不清楚有几个方法,if判断没有段落看着头疼死,我居然把if和for给弄混了...别人要是看的话,还得格式化,svn的话,说不定还得提交...
    哈哈,看来@cgf986916的确不习惯没有缩进的代码,不过这个实现级别的代码确实与优雅沾不上多大关系,请参与摘要内容,期盼@cgf986916的优雅理论。
  • 15楼:老陌 发表于 2014-02-18 22:15 回复此评论

    引用来自“art_youth-web”的评论

    引用来自“cfrs2005”的评论

    被楼主的注解 震惊了

    最基本的
    /*
    *    @param
    *   @desc
    *   @author
    */

    等等诸多
    哈哈,和大多数人一样,被惯性束缚着,代码只是辅助,本类来自发布的eqphp框架。 鄙人认为不必要的注释纯属多余,不过也感谢指教。
    建议您看看 代码152行
  • 16楼:art_youth 发表于 2014-02-18 22:31 回复此评论

    引用来自“老陌”的评论

    引用来自“art_youth-web”的评论

    引用来自“cfrs2005”的评论

    被楼主的注解 震惊了

    最基本的
    /*
    *    @param
    *   @desc
    *   @author
    */

    等等诸多
    哈哈,和大多数人一样,被惯性束缚着,代码只是辅助,本类来自发布的eqphp框架。 鄙人认为不必要的注释纯属多余,不过也感谢指教。
    建议您看看 代码152行
    《代码152行》书?本code第152行?其它?
  • 17楼:OSC688888 发表于 2014-02-18 22:32 回复此评论

    引用来自“art_youth-web”的评论

    引用来自“cfrs2005”的评论

    被楼主的注解 震惊了

    最基本的
    /*
    *    @param
    *   @desc
    *   @author
    */

    等等诸多
    哈哈,和大多数人一样,被惯性束缚着,代码只是辅助,本类来自发布的eqphp框架。 鄙人认为不必要的注释纯属多余,不过也感谢指教。
    我觉得@cfrs2005所说的这种文档注释很好!一目了然,对整个类,或方法。 自己写的当然觉得多余,别人看当然会觉得注释多点好!可节省时间去理解。 然后你写的类很可能会被别人直接拿来用,既然是公开的代码,写上作者、版权什么的 也无可厚非,这个就看作者自己了。
  • 18楼:art_youth 发表于 2014-02-18 22:42 回复此评论

    引用来自“铂金眼”的评论

    引用来自“art_youth-web”的评论

    引用来自“cfrs2005”的评论

    被楼主的注解 震惊了

    最基本的
    /*
    *    @param
    *   @desc
    *   @author
    */

    等等诸多
    哈哈,和大多数人一样,被惯性束缚着,代码只是辅助,本类来自发布的eqphp框架。 鄙人认为不必要的注释纯属多余,不过也感谢指教。
    我觉得@cfrs2005所说的这种文档注释很好!一目了然,对整个类,或方法。 自己写的当然觉得多余,别人看当然会觉得注释多点好!可节省时间去理解。 然后你写的类很可能会被别人直接拿来用,既然是公开的代码,写上作者、版权什么的 也无可厚非,这个就看作者自己了。
    谢谢你的耐心讲解,确实是这样,学习了。非常感谢!
  • 19楼:art_youth 发表于 2014-02-18 22:46 回复此评论
    其实本文的意义不在代码,而是标题和摘要。
    代码其实很简单,研究TP或CI的应该都明白仅仅实现:

    A.连贯操作(链式结构):
    query('表名')
    ->select('字段或join')
    ->where(array('数组条件','字 符串条件'))
    ->group('分组')
    ->having('条件')
    ->order('排序')
    ->limit('数字或字 符串')
    ->out('sql语句或一条记录或一匹记录或分页记录');

    B.构造sql条件:query::condition($condition);
  • 20楼:练打字的 发表于 2014-02-19 09:13 回复此评论

    引用来自“art_youth-web”的评论

    引用来自“cgf986916”的评论

    引用来自“SeeSea”的评论

    引用来自“cgf986916”的评论

    没有缩进,感觉乱七八糟的
    楼主说这是个错误的示范
    有可能,通眼一看,没发现是个类,看不清楚有几个方法,if判断没有段落看着头疼死,我居然把if和for给弄混了...别人要是看的话,还得格式化,svn的话,说不定还得提交...
    哈哈,看来@cgf986916的确不习惯没有缩进的代码,不过这个实现级别的代码确实与优雅沾不上多大关系,请参与摘要内容,期盼@cgf986916的优雅理论。
    哪有,我的优雅就是标准C语言写法,一眼看透;但是这个不强求,习惯就好,
开源从代码分享开始 分享代码