zoukankan      html  css  js  c++  java
  • PHP面向对象之标识对象

    /*
    标识对象模式
    这个模式主要功能就是创建sql语句中的wehre条件字符串的,下面直接看代码和注释:
    
    */
    namespace woomapper;
    
    
    //字段对象
    class Field {
        protected $name = null;          //字段名称
        protected $operator = null;         //操作符    
        protected $comps = array();         //存放条件的数组    
        protected $incomplete = false;     //检查条件数组是否有值
        
        function __construct ($name){
            $this->name= $name;
        }
        
        //添加where 条件
        function addTest($operator,$value){
            $this->comps[] = array('name'=>$this->name,'operator'=>$operator,'value'=>$value);
        }
        
        //获取存放条件的数组
        function getComps(){
            return $this->comps;
        }
        
        function isIncomplete(){
            return empty($this->comps);
        }
    }
    
    
    //标识对象
    class IdentityObject {
        protected $currentfield = null;        //当前操作的字段对象
        protected $fields = array();        //字段集合
        private $and = null;
        private $enforce = array();            //限定的合法字段        
        
        function __construct($field = null, array $enforce = null){
            if(!is_null($enforce)){
                $this->enforce = $enforce;
            }
            if(!is_null($field)){
                $this->field($field);
            }
        }
        
        //获取限定的合法字段
        function getObjectFields(){
            return $this->enforce;
        }
        
        //主要功能为设置当前需要操作的对象
        function field($fieldname){
            if(!$this->isVoid()&& $this->currentfield->isIncomplete()){
                throw new Exception("Incomplete field");
            }
            $this->enforceField($fieldname);
            if(isset($this->fields[$fieldname]){
                $this->currentfield = $this->fields[$fieldname];
            } else {
                $this->currentfield = new Field($fieldname);
                $this->fields[$fieldname] = $this->currentfield;
            }
            return $this;                    //采用连贯语法
        }
        
        //字段集合是否为空
        function isVoid(){
            return empty($this->fields);
        }
        
        //检查字段是否合法
        function enforceField ($fieldname){
            if(!in_array($fieldname,$this->enforce) && !empty($this->enforce)){
                $forcelist = implode(',',$this->enforce);
                throw new Exception("{$fieldname} not a legal field {$forcelist}");
            }
        }
        
        
        //向字段对象添加where条件
        function eq($value){
            return $this->operator("=",$value);
        }
        
        function lt($value){
            return $this->operator("<",$value);
        }
        
        function gt($value){
            return $this->operator(">",$value);
        }
        
        //向字段对象添加where条件
        private function operator($symbol,$value){
            if($this->isVoid){
                throw new Exception("no object field defined");
            }
            $this->currentfield->addTest($symbol,$value);
            return $this;                                     //采用连贯语法
        }
        
        //获取此类中所有字段对象集合的where条件数组
        function getComps(){
            $ret = array();
            foreach($this->fields as $key => $field){
                $ret = array_merge($ret,$field->getComps());
            }
            return $ret;
        }
    }
    
    //客户端代码
    $idobj = new IdentityObject ();
    $idobj->field("name")->eq("The Good Show")->field("start")->gt(time())->lt(time()+(24*60*60));
    $test = $idobj->getComps();
    var_dump($test);
    
    //输出类似下面的内容
    
    /*
    array{
        array('name'=>'name','operator'=>'=','value'=>'The Good Show'),
        array('name'=>'start','operator'=>'>','value'=>'123456'),   //123456表示time()函数输出的时间戳
        array('name'=>'start','operator'=>'<','value'=>'123456')
    }
    
    */
  • 相关阅读:
    两个类重复属性值复制
    IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
    System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
    Oracle 查询表中字段里数据是否有重复
    JS 中如何将<br/> 替换成 /n
    JS 验证数组中是否包含重复元素
    [C#] 使用NPOI将Datatable保存到Excel
    [C#] 将 List 转 DataTable
    [C#] 图文解说调用WebServer实例
    bzoj 3489: A simple rmq problem
  • 原文地址:https://www.cnblogs.com/kerryw/p/7083198.html
Copyright © 2011-2022 走看看