简单谈谈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 相关文章推荐
谈谈PHP语法(4)
Oct 09 PHP
PHP中的日期及时间
Nov 23 PHP
php 生成WML页面方法详解
Aug 09 PHP
PHP基础学习小结
Apr 17 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
Jun 05 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 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中随机显示图片的函数代码
2011/06/23 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
JavaScript Chart 插件整理
2010/06/18 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
JS实现单击输入框弹出选择框效果完整实例
2015/12/14 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
Vue+webpack项目基础配置教程
2018/02/12 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
深入解析Python中的urllib2模块
2015/11/13 Python
python中reload(module)的用法示例详解
2017/09/15 Python
Python3学习urllib的使用方法示例
2017/11/29 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
告诉你怎样写创业计划书
2014/01/27 职场文书
六查六看自查材料
2014/02/17 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS