PHP面向对象之标识对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP面向对象之标识对象相关的知识,希望对你有一定的参考价值。

  1. /*
  2. 标识对象模式
  3. 这个模式主要功能就是创建sql语句中的wehre条件字符串的,下面直接看代码和注释:
  4. */
  5. namespace woo\mapper;
  6. //字段对象
  7. class Field {
  8.     protected $name = null;          //字段名称
  9.     protected $operator = null;         //操作符    
  10.     protected $comps = array();         //存放条件的数组    
  11.     protected $incomplete = false;     //检查条件数组是否有值
  12.     
  13.     function __construct ($name){
  14.         $this->name= $name;
  15.     }
  16.     
  17.     //添加where 条件
  18.     function addTest($operator,$value){
  19.         $this->comps[] = array(‘name‘=>$this->name,‘operator‘=>$operator,‘value‘=>$value);
  20.     }
  21.     
  22.     //获取存放条件的数组
  23.     function getComps(){
  24.         return $this->comps;
  25.     }
  26.     
  27.     function isIncomplete(){
  28.         return empty($this->comps);
  29.     }
  30. }
  31. //标识对象
  32. class IdentityObject {
  33.     protected $currentfield = null;        //当前操作的字段对象
  34.     protected $fields = array();        //字段集合
  35.     private $and = null;
  36.     private $enforce = array();            //限定的合法字段        
  37.     
  38.     function __construct($field = null, array $enforce = null){
  39.         if(!is_null($enforce)){
  40.             $this->enforce = $enforce;
  41.         }
  42.         if(!is_null($field)){
  43.             $this->field($field);
  44.         }
  45.     }
  46.     
  47.     //获取限定的合法字段
  48.     function getObjectFields(){
  49.         return $this->enforce;
  50.     }
  51.     
  52.     //主要功能为设置当前需要操作的对象
  53.     function field($fieldname){
  54.         if(!$this->isVoid()&& $this->currentfield->isIncomplete()){
  55.             throw new \Exception("Incomplete field");
  56.         }
  57.         $this->enforceField($fieldname);
  58.         if(isset($this->fields[$fieldname]){
  59.             $this->currentfield = $this->fields[$fieldname];
  60.         } else {
  61.             $this->currentfield = new Field($fieldname);
  62.             $this->fields[$fieldname] = $this->currentfield;
  63.         }
  64.         return $this;                    //采用连贯语法
  65.     }
  66.     
  67.     //字段集合是否为空
  68.     function isVoid(){
  69.         return empty($this->fields);
  70.     }
  71.     
  72.     //检查字段是否合法
  73.     function enforceField ($fieldname){
  74.         if(!in_array($fieldname,$this->enforce) && !empty($this->enforce)){
  75.             $forcelist = implode(‘,‘,$this->enforce);
  76.             throw new \Exception("{$fieldname} not a legal field {$forcelist}");
  77.         }
  78.     }
  79.     
  80.     
  81.     //向字段对象添加where条件
  82.     function eq($value){
  83.         return $this->operator("=",$value);
  84.     }
  85.     
  86.     function lt($value){
  87.         return $this->operator("<",$value);
  88.     }
  89.     
  90.     function gt($value){
  91.         return $this->operator(">",$value);
  92.     }
  93.     
  94.     //向字段对象添加where条件
  95.     private function operator($symbol,$value){
  96.         if($this->isVoid){
  97.             throw new \Exception("no object field defined");
  98.         }
  99.         $this->currentfield->addTest($symbol,$value);
  100.         return $this;                                     //采用连贯语法
  101.     }
  102.     
  103.     //获取此类中所有字段对象集合的where条件数组
  104.     function getComps(){
  105.         $ret = array();
  106.         foreach($this->fields as $key => $field){
  107.             $ret = array_merge($ret,$field->getComps());
  108.         }
  109.         return $ret;
  110.     }
  111. }
  112. //客户端代码
  113. $idobj = new IdentityObject ();
  114. $idobj->field("name")->eq("The Good Show")->field("start")->gt(time())->lt(time()+(24*60*60));
  115. $test = $idobj->getComps();
  116. var_dump($test);
  117. //输出类似下面的内容
  118. /*
  119. array{
  120.     array(‘name‘=>‘name‘,‘operator‘=>‘=‘,‘value‘=>‘The Good Show‘),
  121.     array(‘name‘=>‘start‘,‘operator‘=>‘>‘,‘value‘=>‘123456‘),   //123456表示time()函数输出的时间戳
  122.     array(‘name‘=>‘start‘,‘operator‘=>‘<‘,‘value‘=>‘123456‘)
  123. }
  124. */

以上是关于PHP面向对象之标识对象的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象之标识映射

PHP面向对象之工作单元

php面向对象之__toString()

php 面向对象之封装

PHP之面向对象篇

PHP学习笔记之面向对象(上)