简单谈谈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 相关文章推荐
一个取得文件扩展名的函数
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
PHP通用检测函数集合
Nov 25 PHP
PHP中最容易忘记的一些知识点总结
Apr 28 PHP
PHP实现的sqlite数据库连接类
Dec 12 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
wamp服务器访问php非常缓慢的解决过程
Jul 01 PHP
简单谈谈PHP vs Node.js
Jul 17 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
Jun 06 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 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中使用redis队列操作实例代码
2013/02/07 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
Python中使用django form表单验证的方法
2017/01/16 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
实例讲解Python中的私有属性
2014/08/21 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
Django的信号机制详解
2017/05/05 Python
python SVM 线性分类模型的实现
2019/07/19 Python
python list转置和前后反转的例子
2019/08/26 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
美国在线珠宝商店:SZUL
2017/02/11 全球购物
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
捷克厨房用品购物网站:Tescoma
2018/07/13 全球购物
咖啡馆创业计划书
2014/01/26 职场文书
营业用房租赁协议书
2014/11/26 职场文书
迟到检讨书范文
2015/01/27 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis