简单谈谈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 相关文章推荐
php实现ping
Oct 09 PHP
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
php并发对MYSQL造成压力的解决方法
Feb 21 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
Sep 16 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
PHP微信开发之有道翻译
Jun 23 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
详解yii2使用多个数据库的案例
Jun 16 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
Aug 02 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的session cookie错误
2009/08/09 PHP
php实现telnet功能示例
2014/04/08 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
this[] 指的是什么内容 讨论
2007/03/24 Javascript
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
简单谈谈python的反射机制
2016/06/28 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
前端隐藏出边界内容的实现方法
2016/04/14 HTML / CSS
英国健身专家:WIT Fitness
2021/02/09 全球购物
师范生自荐信
2013/10/27 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
谢师宴学生致辞
2015/07/27 职场文书