简单谈谈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 相关文章推荐
实用函数10
Nov 08 PHP
详解php的魔术方法__get()和__set()使用介绍
Sep 19 PHP
基于php iconv函数的使用详解
Jun 09 PHP
php增删改查示例自己写的demo
Sep 04 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
php实现删除指定目录下相关文件的方法
Oct 20 PHP
如何让CI框架支持service层
Oct 29 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
PHP实现链式操作的核心思想
Jun 23 PHP
解决PHP里大量数据循环时内存耗尽的方法
Oct 10 PHP
php实现获取近几日、月时间示例
Jul 06 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 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
Smarty日期时间操作方法示例
2016/11/15 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
2013/07/04 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
Python多进程同步简单实现代码
2016/04/27 Python
python实现SMTP邮件发送功能
2020/06/16 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
用python实现刷点击率的示例代码
2019/02/21 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
Python timeit模块原理及使用方法
2020/10/10 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
社区庆八一活动方案
2014/02/02 职场文书
安全标准化实施方案
2014/02/20 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
优秀班主任申报材料
2014/12/16 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书