简单谈谈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网上商城购物车设计代码分享
Feb 15 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
php通过session防url攻击方法
Dec 10 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
Laravel中注册Facades的步骤详解
Mar 16 PHP
PHP读取mssql json数据中文乱码的解决办法
Apr 11 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
php-msf源码详解
Dec 25 PHP
PHP数组遍历的几种常见方式总结
Feb 15 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 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在线生成ico文件的代码
2007/10/09 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
dess中一个简单的多路委托的实现
2010/07/20 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
Python中变量交换的例子
2014/08/25 Python
Python最长公共子串算法实例
2015/03/07 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python读取properties配置文件操作示例
2018/03/29 Python
python简易远程控制单线程版
2018/06/20 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
python实现3D地图可视化
2020/03/25 Python
Python远程linux执行命令实现
2020/11/11 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
春节联欢晚会主持词范文
2014/03/24 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
给学校的建议书范文
2014/05/15 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
公司劳动纪律管理制度
2015/08/04 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
教你nginx跳转配置的四种方式
2022/07/07 Servers