PHP面向对象之标识对象

/*
标识对象模式
这个模式主要功能就是创建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‘)
}

*/
时间: 2024-12-20 18:45:07

PHP面向对象之标识对象的相关文章

JS中面向对象的,对象理解、构造函数、原型、原型链

6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性.对象上定义的属性默认值为true [[enumerable]] 表示能否通过for-in循环返回属性.直接在对象上定义的属性,它们的这个特性默认值为true [[writable]] 表示能否修改属性值.像前面例子中那样直接在对象上定义的属性,它们默认值为t

面向对象与基于对象的区别

面向对象和基于对象的区别是多态,和继承无关. 基于对象仅仅支持了抽象数据类型的功能,继承也不过体现了一种is-a的关系,也是抽象数据类型,只是建立了一个层次体系.但是什么是面向对象呢?就是根 据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式.换句话说,也就是虚函数实现的多态.以上观点,在OO设计中已经得到了公认, 多态的另一种实现方法是泛型. “面向对象”和“基于对象”两个不同的概念.面向对象的三大特点(封装,继承,多态)却一不可,通常“基于对象”使用对象,但是无法利用现有

php面向对象之克隆对象

在前面的PHP面向对象之对象和引用,我们试图以"$b=$a"的方式复制对象以传递对象的值(内容),结果却是传递对象的地址,在结尾为了解决复制对象这个问题,提到了克隆的方法.接下来讲一下php面向对象之克隆对象. 前面我们已经知道,使用传址引用的方式调用对象,实质调用的是同一个对象,有时需要建设立一个对象的副本,改变原来的对象时不希望影响到副本,在PHP中可以根据现在的对象来克隆出一个完全一样的对象,克隆出来的副本和原本两个对象完全独立而互不干扰. 对象克隆 在php中使用"c

java基础面向对象之类与对象

java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 ?封装性:保护内部结构的安全性 ?继承性:在已有的程序结构上扩充新的功能 ?多态性:在某一个该娘范围内满足 2)面向对象开发分为以下几个步骤: OOA(面向对象分析) OOD(面向对象设计) OOP(面向对象编程) 2.类与对象 1)了解类与对象的关系 ?认识类与对象 类与对象是整个面向对象之中最基础的组成单元,类是共性的一个集合,而对象是某一

关于面向对象和基于对象

面向对象和基于对象的区别是多态,和继承无关. 基于对象仅仅支持了抽象数据类型的功能,继承也不过体现了一种is-a的关系,也是抽象数据类型,只是建立了一个层次体系.但是什么是面向对象呢?就是根据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式.换句话说,也就是虚函数实现的多态.以上观点,在OO设计中已经得到了公认,多态的另一种实现方法是泛型. “面向对象”和“基于对象”两个不同的概念.面向对象的三大特点(封装,继承,多态)却一不可,通常“基于对象”使用对象,但是无法利用现有的对

sdut 上机练习8面向对象编程(对象的数组)

上机练习8面向对象编程(对象的数组) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 利用类对象数组完毕N个学生数据(学号是字符串类型.成绩是整型)的输入.输出. 输入 输入有N+1行: 第一行的整数N表示学生数目: 下面N行是N个学生的数据,每行中第一个是表示学号的字符串,第二个是表示学生成绩的整数. 输出 输出N个学生数据. 每一个学生的数据占一行. 演示样例输入 5 01 89 02 78 03 56 04 92 05 76 演示样例输出 01

Java面向对象-类与对象

Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建和使用 看下面实例 我们在com.java1234.chap03.sec01包下新建一个Person类 1 package com.java1234.chap03.sec01; 2 3 /** 4 * Person类 文件名和类名必须一致 5 * @author user 6 * 7 */ 8 pu

面向对象编程-何为对象

转自知乎 面向对象,那么对象就是主导因素.因此我们首先实现的不是函数,而是"类",也即对象.. 面向对象:对象就是物体,这种编程思想就是设定一个有一定功能的物体,然后利用这个物体的功能做你想做的事情.(这个物体有attributes,比如名字啊,年龄啊等等等等,有methods,比如吃喝拉撒睡等等等等,功能==methods)面向过程:你想干嘛,就直接写个功能,然后做你想做的事情. 借楼上的例子,你想写个程序洗衣服,面向对象就是设定一个人,把这个对象赋予拿衣服,搭车,交易,取衣服,回家

C#编程语言与面向对象——类与对象

由于ASP.NET技术是全面向对象的,因此,要掌握这一技术,必须具备有扎实的面向对象理论基础 使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类中之外的函数,因此,类是面向对象编程的基本单元 在绝大多数面向对象语言中,一个类都可以包含两种成员:字段和方法.字段与方法这两个概念是面向对象理论的术语,是通用与各种面向对象语言的.而在各种的具体面向对象语言(比如C#)中,可以简单地理解: 字段及变量,方法及函数. C#编程语言与面向对象--类与对象