包 | 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 |
public void __construct($type)
$type | string | 集合对象类型 |
{return} |
构造函数
public static QColl createFromArray($objects, $type, $keep_keys)
$objects | array | 包含多个对象的数组 |
$type | string | 集合对象类型 |
$keep_keys | boolean | 是否在创建集合时保持数组的键名 |
{return} | QColl | 新创建的集合对象 |
从数组创建一个集合
QColl::createFromArray() 方法从一个包含多个对象的数组创建集合。 新建的集合包含数组中的所有对象,并且确保对象的类型符合要求。
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');
public boolean offsetExists($offset)
$offset | mixed | |
{return} | boolean |
检查指定索引的对象是否存在,实现 ArrayAccess 接口
echo isset($coll[1]);
public mixed offsetGet($offset)
$offset | mixed | |
{return} | mixed |
返回指定索引的对象,实现 ArrayAccess 接口
$item = $coll[1];
public void offsetSet($offset, $value)
$offset | mixed | |
$value | mixed | |
{return} |
设置指定索引的对象,实现 ArrayAccess 接口
$coll[1] = $item;
public void offsetUnset($offset)
$offset | mixed | |
{return} |
注销指定索引的对象,实现 ArrayAccess 接口
unset($coll[1]);
public mixed shift()
Shift an element off the beginning of QColl
public mixed current()
返回当前位置的对象,实现 Iterator 接口
public mixed key()
返回遍历时的当前索引,实现 Iterator 接口
public void next()
遍历下一个对象,实现 Iterator 接口
public void rewind()
重置遍历索引,实现 Iterator 接口
public boolean valid()
判断是否是调用了 rewind() 或 next() 之后获得的有效对象,实现 Iterator 接口
public int count()
返回对象总数,实现 Countable 接口
public boolean isEmpty()
确定集合是否是空的
public object first()
返回集合中的第一个对象,如果没有任何对象,则抛出异常
public object last()
返回集合中的最后一个对象,如果没有任何对象,则抛出异常
public QColl append($data)
$data | array|QColl | 要追加的数据 |
{return} | QColl | 返回集合对象本身,实现连贯接口 |
追加数组或 QColl 对象的内容到集合中
$data = array( $item1, $item2, $item3 ); $coll->append($data);
QColl::append() 在追加数据时不会保持键名。
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');
public array toHashMap($key_name, $value_name)
$key_name | string | |
$value_name | string | |
{return} | array |
将集合所有元素的值转换为一个名值对数组
public array getCols($col)
$col | string | 要查询的键 |
{return} | array | 包含指定键所有值的数组 |
返回指定键的所有值
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 则遍历集合中的所有对象,尝试调用对象的指定方法。
protected void _checkType($object)
$object | object | |
{return} |
检查值是否符合类型要求