包 core

包 mvc

包 orm

包 form

包 database

包 helper

包 cache

包 webcontrols

包 behavior

包 exception

包 debug

类 - QColl

core
类层次 class QColl
实现的接口
版本 $Id: coll.php 2590 2009-06-18 08:09:45Z jerry $

QColl 实现了一个类型安全的对象集合

QColl 会检查每一个对象的类型是否符合预期,以便将同一类型的对象组织在一起。 QColl 具有和 PHP 内置数组相似的性质,因此可以按照使用数组的方式来使用 QColl 集合。

在构造一个集合时,必须指定该集合能够容纳的对象类型:

$coll = new QColl('MyObject');
$coll[] = new MyObject();
 
// 在尝试存入 MyObject2 类型的对象到 $coll 中时将抛出异常
$coll[] = new MyObject2();
 
// 指定一个对象
$coll[$offset] = $item;
 
// 遍历一个集合
foreach ($coll as $offset => $item)
{
    dump($item, $offset);
}

公共方法

隐藏继承的方法

方法描述定义于
__construct() 构造函数 QColl
createFromArray() 从数组创建一个集合 QColl
values() 遍历集合中的所有对象,返回包含特定属性值的数组 QColl
offsetExists() 检查指定索引的对象是否存在,实现 ArrayAccess 接口 QColl
offsetGet() 返回指定索引的对象,实现 ArrayAccess 接口 QColl
offsetSet() 设置指定索引的对象,实现 ArrayAccess 接口 QColl
offsetUnset() 注销指定索引的对象,实现 ArrayAccess 接口 QColl
shift() Shift an element off the beginning of QColl QColl
current() 返回当前位置的对象,实现 Iterator 接口 QColl
key() 返回遍历时的当前索引,实现 Iterator 接口 QColl
next() 遍历下一个对象,实现 Iterator 接口 QColl
rewind() 重置遍历索引,实现 Iterator 接口 QColl
valid() 判断是否是调用了 rewind() 或 next() 之后获得的有效对象,实现 Iterator 接口 QColl
count() 返回对象总数,实现 Countable 接口 QColl
isEmpty() 确定集合是否是空的 QColl
first() 返回集合中的第一个对象,如果没有任何对象,则抛出异常 QColl
last() 返回集合中的最后一个对象,如果没有任何对象,则抛出异常 QColl
append() 追加数组或 QColl 对象的内容到集合中 QColl
search() 查找符合指定属性值的对象,没找到返回 NULL QColl
toHashMap() 将集合所有元素的值转换为一个名值对数组 QColl
getCols() 返回指定键的所有值 QColl
__call() 对集合中每一个对象调用指定的方法 QColl

保护的方法

隐藏继承的方法

方法描述定义于
_checkType() 检查值是否符合类型要求 QColl

属性详细说明

$_type 属性

集合对象的类型

$_coll 属性

保存对象的数组

$_is_valid 属性

指示迭代对象是否有效

方法详细说明

__construct() 方法

public void __construct($type)

$type string 集合对象类型
{return}

构造函数


createFromArray() 方法

public static QColl createFromArray($objects, $type, $keep_keys)

$objects array 包含多个对象的数组
$type string 集合对象类型
$keep_keys boolean 是否在创建集合时保持数组的键名
{return} QColl 新创建的集合对象

从数组创建一个集合

QColl::createFromArray() 方法从一个包含多个对象的数组创建集合。 新建的集合包含数组中的所有对象,并且确保对象的类型符合要求。


values() 方法

public array values($prop_name)

$prop_name string 要获取集合对象的哪一个属性
{return} array 包含所有集合对象指定属性值的数组

遍历集合中的所有对象,返回包含特定属性值的数组

$coll = new QColl('Post');
$coll[] = new Post(array('title' => 't1'));
$coll[] = new Post(array('title' => 't2'));
 
// 此时 $titles 中包含 t1 和 t2 两个值
$titles = $coll->values('title');

offsetExists() 方法

public boolean offsetExists($offset)

$offset mixed
{return} boolean

检查指定索引的对象是否存在,实现 ArrayAccess 接口

echo isset($coll[1]);

offsetGet() 方法

public mixed offsetGet($offset)

$offset mixed
{return} mixed

返回指定索引的对象,实现 ArrayAccess 接口

$item = $coll[1];

offsetSet() 方法

public void offsetSet($offset, $value)

$offset mixed
$value mixed
{return}

设置指定索引的对象,实现 ArrayAccess 接口

$coll[1] = $item;

offsetUnset() 方法

public void offsetUnset($offset)

$offset mixed
{return}

注销指定索引的对象,实现 ArrayAccess 接口

unset($coll[1]);

shift() 方法

public mixed shift()

Shift an element off the beginning of QColl


current() 方法

public mixed current()

返回当前位置的对象,实现 Iterator 接口


key() 方法

public mixed key()

返回遍历时的当前索引,实现 Iterator 接口


next() 方法

public void next()

遍历下一个对象,实现 Iterator 接口


rewind() 方法

public void rewind()

重置遍历索引,实现 Iterator 接口


valid() 方法

public boolean valid()

判断是否是调用了 rewind() 或 next() 之后获得的有效对象,实现 Iterator 接口


count() 方法

public int count()

返回对象总数,实现 Countable 接口


isEmpty() 方法

public boolean isEmpty()

确定集合是否是空的


first() 方法

public object first()

返回集合中的第一个对象,如果没有任何对象,则抛出异常


last() 方法

public object last()

返回集合中的最后一个对象,如果没有任何对象,则抛出异常


append() 方法

public QColl append($data)

$data array|QColl 要追加的数据
{return} QColl 返回集合对象本身,实现连贯接口

追加数组或 QColl 对象的内容到集合中

$data = array(
    $item1,
    $item2,
    $item3
);
 
$coll->append($data);

QColl::append() 在追加数据时不会保持键名。


search() 方法

public mixed search($prop_name, $needle, $strict)

$prop_name string 要搜索的属性名
$needle mixed 需要的属性值
$strict boolean 是否严格比对属性值
{return} mixed

查找符合指定属性值的对象,没找到返回 NULL

// 在 $coll 集合中搜索 title 属性等于 T1 的第一个对象
$item = $coll->search('title', 'T1');

toHashMap() 方法

public array toHashMap($key_name, $value_name)

$key_name string
$value_name string
{return} array

将集合所有元素的值转换为一个名值对数组


getCols() 方法

public array getCols($col)

$col string 要查询的键
{return} array 包含指定键所有值的数组

返回指定键的所有值


__call() 方法

public mixed __call($method, $args)

$method string
$args
{return} mixed

对集合中每一个对象调用指定的方法

class OrderItem
{
    public $price;
    public $quantity;
 
    function __construct($price, $quantity)
    {
        $this->price = $price;
        $this->quantity = $quantity;
    }
 
    // 计算订单项目的小计
    function sum()
    {
        return $this->price * $this->quantity;
    }
 
    // 返回单价
    function price()
    {
        return $this->price;
    }
 
    // 返回数量
    function quantity()
    {
        return $this->quantity;
    }
 
    // 累加多个合计
    static function totalSum($objects)
    {
        $total = 0;
        while (list(, $item) = each($objects))
        {
            $total += $item->sum();
        }
        return $total;
    }
 
    // 用于 QColl 的回调方法
    static function _qcoll_callback()
    {
        return array('sum' => 'totalSum');
    }
}
 
// 构造一个集合,包含多个 OrderItem 对象
$coll = QColl::create(array(
    new OrderItem(100, 3),
    new OrderItem(200, 5),
    new OrderItem(300, 2)), 'OrderItem');
 
// 取得集合中所有订单项目的金额合计
$sum = $coll->sum();
 
// 将会输出 1900 (根据 100 * 3 + 200 * 5 + 300 * 2 计算)
echo $sum;
 
// 取得每个项目的单价
$price = $coll->price();
// 将会输出 array(100, 200, 300)
dump($price);

当调用 QColl 自身没有定义的方法时,QColl 将认为开发者是要对集合中的每一个对象调用指定方法。

  • 此时,QColl 首先检查集合中的对象是否提供了 _qcoll_callback() 静态方法;
  • 如果有,则通过 _qcoll_callback() 取得一个方法映射表;
  • QColl 根据 _qcoll_callback() 返回的方法映射表调用对象的其他静态方法。
  • 如果没有提供 _qcoll_callback() 方法,或方法映射表中没有指定的方法。

    QColl 则遍历集合中的所有对象,尝试调用对象的指定方法。


_checkType() 方法

protected void _checkType($object)

$object object
{return}

检查值是否符合类型要求