ArrayAccess的使用
Collection 既然是个类,那要怎么才能像数组那样便利的操作呢?如 $a['key'] 。
答案是:继承接口类 ArrayAccess,并实现该类的几个接口,如下:
abstract public boolean offsetExists ( mixed $offset ) //判断key即$offset的数组元素是否存在,相当于 isset($a[$offset])abstract public mixed offsetGet ( mixed $offset ) //数组元素获取,相当于 $value = $a[$offset]abstract public void offsetSet ( mixed $offset , mixed $value ) //数组元素设置 相当于 $a[$offset] = $valueabstract public void offsetUnset ( mixed $offset ) //删除数组元素,相当于 unset($a[$offset]);
现在回头看看 Collection 的源码是怎么实现的。
如何使用,来个例子:
use think;$c = new Collection;$c['a'] = 'hello a';$c['b'] = 'you are b';echo $c['a'] . '<br/>';echo $c['b'] . '<br/>';foreach ($c as $k => $v) { echo "key: $k, val: $v <br/>";}
结果输出:
hello a you are bkey: a, val: hello akey: b, val: you are b
JsonSerializable的使用
如果对一个对象进行 json 编码的话,其实就是对该对象的 public 属性进行 json 化,那如何定制 json 化的内容和输出呢?
答案是:继承 JsonSerializable 接口类,并实现类中的接口:
abstract public mixed jsonSerialize ( void ) //定制json化的字符串输出
现在回头看看 Collection 的源码是怎么实现的。
如何使用,来个例子:
echo json_encode($c) . '<br/>';
结果输出:
{"a":"hello a","b":"you are b"}
Countable的使用
如果对一个对象进行 count() 操作的话,其实就是统计该对象的 public 属性的总数,那如何定制 count() 呢?
答案是:继承 Countable 接口类,并实现类中的接口:
abstract public int count ( void )
现在回头看看 Collection 的源码是怎么实现的。
如何使用,来个例子:
echo 'count: ' . $c->count() . '<br/>';// 或者echo 'count: ' . count($c) . '<br/>';
结果输出:
count: 2count: 2
IteratorAggregate、ArrayIterator的使用
如何实现迭代器的功能?如可进行 foreach 操作,提供迭代相关的函数等。
答案是:继承接口类 IteratorAggregate (聚合式迭代器),并实现类中的接口:
abstract public Traversable getIterator ( void )
如何实现该接口,调用生成一个 ArrayIterator 类,该类可提供迭代器的所有功能。
现在回头看看 Collection 的源码是怎么实现的。
如何使用,来个例子:
$c['c'] = 'not just c';$iter = $c->getIterator(); //获取迭代器// 可方便地使用foreach操作foreach ($iter as $k => $v) { echo "key: $k, val: $v <br/>";}echo 'count: ' . $iter->count() . '<br/>'; // 当前数组元素个数$iter->rewind(); // 数组位置复位echo 'current: ' . $iter->current() . '<br/>'; // 当前位置数组元素的值
结果输出:
key: a, val: hello a key: b, val: you are b key: c, val: not just c count: 3current: hello a