zoukankan      html  css  js  c++  java
  • 【转】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

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

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/GaZeon/p/5282837.html
Copyright © 2011-2022 走看看