简单谈谈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 获得汉字拼音首字母的函数
Aug 01 PHP
php shell超强免杀、减少体积工具实现代码
Oct 16 PHP
解析php做推送服务端实现ios消息推送
Jul 01 PHP
php实现session自定义会话处理器的方法
Jan 27 PHP
举例讲解PHP面对对象编程的多态
Aug 12 PHP
php+mysql实现的二级联动菜单效果详解
May 10 PHP
Laravel5中防止XSS跨站攻击的方法
Oct 10 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
php preg_match的匹配不同国家语言实例
Dec 29 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP中md5()函数的用法讲解
Mar 30 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下intval()和(int)转换使用与区别
2008/07/18 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
JS 实现完美include载入实现代码
2010/08/05 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
详谈innerHTML innerText的使用和区别
2017/08/18 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python程序员开发中常犯的10个错误
2014/07/07 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
小学三好学生事迹材料
2014/08/15 职场文书
运动与健康自我评价
2015/03/09 职场文书
停电放假通知
2015/04/14 职场文书
民间借贷纠纷案件代理词
2015/05/26 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis