简单谈谈PHP面向对象之标识对象


Posted in PHP onJune 27, 2017

标识对象模式

这个模式主要功能就是创建sql语句中的wehre条件字符串的,下面直接看代码和注释:

namespace woo\mapper;


//字段对象
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')
}

*/

以上这篇简单谈谈PHP面向对象之标识对象就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
PHP中ADODB类详解
Mar 25 PHP
PHP脚本中include文件出错解决方法
Nov 20 PHP
PHP 实现多服务器共享 SESSION 数据
Aug 15 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
PHP isset()与empty()的使用区别详解
Aug 29 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
php操作XML、读取数据和写入数据的实现代码
Aug 15 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
May 30 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 #PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 #PHP
thinkphp框架page类与bootstrap分页(美化)
Jun 25 #PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 #PHP
php-fpm开启状态统计的方法详解
Jun 23 #PHP
PHP多种序列化/反序列化的方法详解
Jun 23 #PHP
PHP后端银联支付及退款实例代码
Jun 23 #PHP
You might like
一个PHP针对数字的加密解密类
2014/03/20 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
php依赖注入知识点详解
2019/09/23 PHP
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
js 窗口抖动示例
2013/09/04 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
2018/08/13 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
关于python多重赋值的小问题
2019/04/17 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
豪华复古化妆:Besame Cosmetics
2019/09/06 全球购物
幼儿园教师请假制度
2014/01/16 职场文书
安全事故检讨书
2014/01/18 职场文书
骨干教师考核方案
2014/05/09 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL