SPL学习笔记之四:数组重载

数组重载是指将对象作为数组使用的过程,这在其它程序语言中称为索引器。

ArrayAccess接口使对象的行为看起来和数组一样,它包含了四个方法:

1. offsetSet($offset, $value):设置用于数组访问的偏移量

2. offsetGet($offset):获取某个特定偏移量上的值

3. offsetExists($offset):判断给定的偏移量上是否存在可通过offsetGet($offset)函数获取的值,返回true或false

4. offsetUnset($offset):从集合中删除一项。当使用unset语句或者将某个偏移量的值设置为null时,这个方法会被调用

提供ArrayAccess接口的主要原因是并非所有的集合都是基于真实的数组。使用ArrayAccess接口的集合可能会将请求代理到SOA的后端程序,或者其它形式的离线存储。这允许推迟底层数据的获取时间,直到它被实际访问时才去获取这些数据。

ArrayAccess接口自身并没有提供计算数组中元素数量的功能,这是因为并非所有的ArrayAccess类都有固定的长度。不过,那些具有固定长度的类可以并且可能应该实现Countable接口,它只包含一个count()方法,并且返回元素数量。

 

ArrayObject类是一个ArrayAccess接口的实现类,它还提供了迭代功能,以及很多用来排序和处理数据的方法。ArrayObject类还实现了Countable接口。它在内部是基于Array实现的,所以它的限制在于只能处理真实的已经完整填充好的数据,但它可以为应用程序提供有价值的基类。

ArrayObject包含如下方法:

1. append($value):在列表的末尾添加另外一个元素

2. asort():在底层数组值上应用PHP的asort()函数

3. ksort():根据键值为数组排序

4. natcasesort():使用自然顺序算法以不区分大小写的方式排序

5. natsort():使用自然排序算法以区分大小写的方式排序

6. uasort($compare):创建一个自定义的排序函数,$compare参数应该是使用标准PHP回调语法表示的一个函数回调

7. uksort($compare):与uasort()方法类似,但操作对象为键值

8. getarraycopy():返回底层数组的一份副本

9. exchangearray($array):修改底层数组,将其替换成另外一个数组

 

ArrayObject类使用范例:

 

 

SPL购物车范例:

创建两个类:一个是通用的Product类,它封装了一个产品和产品的属性。另外一个是购物车Cart类。

Product类(Product.php):

 

Cart类(Cart.php):

 

实际调用:

 

 

通常,在PHP中不允许使用对象作为数组的键值。SPL提供一个spl_object_hash()函数,这个函数可以为所有的对象实例创建一个唯一的标识符,从而允许在数组中存储对象的散列值作为键值。

下面是一个将复杂对象作为数组的键值存储的范例:

KeyObject类作为存储为键值的对象,CollectionObject类实现自定义的ArrayAccess接口方法,从而可以作为数组使用。为了支持迭代访问功能,需要从ArrayIterator迭代器扩展这个类,或者去实现IteratorAggregate接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值