简单谈谈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 相关文章推荐
PHP4.04简明安装
Oct 09 PHP
mysql5写入和读出乱码解决
Nov 25 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
Nov 07 PHP
php多文件上传实现代码
Feb 20 PHP
php运行时动态创建函数的方法
Mar 16 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
Jul 06 PHP
PHP函数引用返回的实例详解
Sep 11 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
Jun 20 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
统计PHP目录中的文件数方法
Mar 05 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 图像函数大举例(非原创)
2009/06/20 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
PHP简洁函数小结
2011/08/12 PHP
利用Laravel事件系统如何实现登录日志的记录详解
2017/05/20 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
js点击更换背景颜色或图片的实例代码
2013/06/25 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
js使用for循环查询数组中是否存在某个值
2014/08/12 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python字符串格式化
2015/06/15 Python
python自带的http模块详解
2016/11/06 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Pyqt5实现英文学习词典
2019/06/24 Python
基于keras中的回调函数用法说明
2020/06/17 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
介绍一下gcc特性
2012/01/20 面试题
数字天堂软件测试面试题
2012/12/23 面试题
采购类个人求职的自我评价
2014/02/18 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
护士节活动总结
2014/08/29 职场文书
销售助理岗位职责
2015/02/11 职场文书
音乐会主持人开场白
2015/05/28 职场文书
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS