简单谈谈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 相关文章推荐
非常不错的MySQL优化的8条经验
Mar 24 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
php自动获取字符串编码函数mb_detect_encoding
May 31 PHP
Apache下禁止php文件被直接访问的解决方案
Apr 25 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
浅析php单例模式
Nov 25 PHP
php创建、获取cookie及基础要点分析
Jan 26 PHP
CI框架表单验证实例详解
Nov 21 PHP
php实现支持中文的文件下载功能示例
Aug 30 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
在 Laravel 6 中缓存数据库查询结果的方法
Dec 11 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的mssql数据库连接类实例
2014/11/28 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
javascript的函数
2007/01/31 Javascript
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
Pandas的Apply函数具体使用
2020/07/21 Python
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
关于元旦的广播稿
2014/02/16 职场文书
公司新年寄语
2014/04/04 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA