简单谈谈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 相关文章推荐
Windows下的PHP5.0安装配制详解
Sep 05 PHP
使用eAccelerator加密PHP程序
Oct 03 PHP
php不用正则验证真假身份证
Nov 06 PHP
php中socket的用法详解
Oct 24 PHP
php中explode的负数limit用法分析
Feb 27 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 PHP
PHP工程师VIM配置分享
Dec 15 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
轻松实现php文件上传功能
Feb 17 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 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下实现折线图效果的代码
2007/04/28 PHP
php fsockopen中多线程问题的解决办法[翻译]
2011/11/09 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
针对后台列表table拖拽比较实用的jquery拖动排序
2016/10/10 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
利用pyuic5将ui文件转换为py文件的方法
2019/06/19 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
分享一个python的aes加密代码
2020/12/22 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
寄语十八大感言
2014/02/07 职场文书
业务员自荐信范文
2014/04/20 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
基层党组织整改方案
2014/10/25 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS