• 【转】PHP实现连贯操作


    【第一种方案 __call】

    我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码。

    M('User')->where(array('id'=>1))->field('name')->select();

    这样不仅有利于编码,而且也能让人"心情愉悦"呢。好了,不多说了。让我们看看如何实现的吧?

    <?php
        //数据库操作基类[PS:主要功能连贯功能实现]
        class Db{
            //此属性定义要实现连贯操作的方法名
            public $sql = array(
                "field" => "",
                "where" => "",
                "order" => "",
                "limit" => "",
                "group" => "",
                "having" => "",
            );
    
            /**
             * 连贯操作时,调用field() where() order() limit() group() having()方法且组合成sql语句
             * 此方法为PHP魔术方法,调用类中不存在的方法时就会自动调用此方法
             * @param $methodName 调用不存在的方法时,接收这个方法名称的字符串
             * @param $args 调用不存在的方法时,接收这个方法的参数,以数组形式接收
             */
            function __call($methodName,$args){
                //把要请求的方法名,统一转为小写
                $methodName=strtolower($methodName);
                //若请求方法名与成员属性数组$sql下标对应上;则将第二个参数,赋值给数组中"下标对应的元素"
    
                if(isset($this->sql[$methodName])){
                    $this->sql[$methodName]=$args[0];
                }else{
                    echo '调用类'.get_class($this).'中的'.$methodName.'()方法不存在';
                }
                //返回对象;从而可以继续调用本对象中的方法,形成连贯操作
                return $this;
            }
    
            /**
             * 用此方法拼接成一个select的sql语句;[PS:此方法终结了连贯操作,置于连贯操作的最后面]
             */
            function select(){
                //按照select语法拼接sql字符串[PS:可以在mysql命令行中执行"help select;"查看其语法构结]
                $sql="SELECT {$this->sql['field']} FROM test {$this->sql['where']} {$this->sql['group']} {$this->sql['having']} {$this->sql['order']} {$this->sql['limit']}";
                echo $sql;
            }
        }
    
        $obj=new db();
        $obj->field('name,sex,address')->where('where name="gongwen"')->limit('limit 1')->select();
    
        //输出:SELECT name,sex,address FROM test where name=gongwen limit 1

    原文出处http://www.gwalker.cn/article-163.html

    【第二种方案 不使用__call】

    下面写的这个例子,则不是用_call的,大家可以扩展一下吧。

    /*
     * SQL语句组合实例类,始发文章web开发笔记
     * 学习用,非专业类
     * */
    class sql{
        private $sql=array("from"=>"",
                "where"=>"",
                "order"=>"",
                "limit"=>"");
      
        public function from($tableName) {
            $this->sql["from"]="FROM ".$tableName;
            return $this;
        }
      
        public function where($_where='1=1') {
            $this->sql["where"]="WHERE ".$_where;
            return $this;
        }
      
        public function order($_order='id DESC') {
            $this->sql["order"]="ORDER BY ".$_order;
            return $this;
        }
      
        public function limit($_limit='30') {
            $this->sql["limit"]="LIMIT 0,".$_limit;
            return $this;
        }
        public function select($_select='*') {
            return "SELECT ".$_select." ".(implode(" ",$this->sql));
        }
    }
      
    $sql =new sql();
      
    echo $sql->from("testTable")->where("id=1")->order("id DESC")->limit(10)->select();
    //输出 SELECT * FROM testTable WHERE id=1 ORDER BY id DESC LIMIT 0,10

    摘自脚本之家,原作者不详。

  • 相关阅读:
    js 线程机制与事件处理机制
    js 对象高级
    js 函数高级
    js 基础总结
    JSON
    js BOM
    js DOM
    正则表达式
    splice()、push()、pop()、unshift()、pop()、reverse()等数组响应式方法
    Centos下执行make时出现mysql.h: No such file or directory
  • 原文地址:https://www.cnblogs.com/GaZeon/p/5282837.html
Copyright © 2020-2023  润新知