天天看点

SPL学习笔记之一:SPL简介

      SPL(标准PHP库)是PHP5面向对象功能中最重要的组成部分。它在5个关键的方面提升了PHP语言,包括:迭代器、异常、数组重载、XML以及文件和数据处理能力。它还提供了另外一些有用的项,例如观察者模式、计数功能、用于对象标识符的辅助函数以及迭代器处理功能。此外,它还提供了用于自动加载类和接口的高级功能。

      在引擎层次,SPL实现了提供所有高级功能的6个类和接口。这些接口和Exception类都具有特殊性,即它们实际上与传统的接口不同。它们拥有特别强大的功能,并且允许引擎以一种特定且特殊的方式挂接进代码中。下面是这些元素的一个简单介绍。

      ArrayAccess:ArrayAccess接口允许创建可以被当作数组的类。

      Exception:SPL的扩展为Exception类提供了一系列增强功能以及更多类型。

      Iterator:Iterator接口使得对象可以和诸如foreach这样的循环结构一起工作。

      IteratorAggregate:IteratorAggregate接口允许将Iterator接口要求实现的方法放到其它类去实现。

      Serializable:Serializable接口挂接进了Serialize函数和Unserialize函数,和其他如会话这样的功能一样,可以确保类被正确地持久化保存和恢复。

      Traversable:Traversable接口是由Iterator接口和IteratorAggregate接口使用的,用来确定某个类是否可以用foreach来迭代访问。这是一个内部接口,不能被用户实现。

迭代器:

迭代器是实现了Iterator接口的类。通过实现这个接口,类可以被用在循环结构中,并且能够提供一些高级的数据访问模式。

从循环访问对象到循环访问数据库结果集都会用到迭代器,甚至在循环访问文件时也可以用到迭代器。

迭代器接口方法:

current():返回当前元素的值

key():返回当前的键名称或索引值

next():让数组指针向前进一位指向下一个元素

rewind():将数组指针移到开头位置

valid():判断当前元素是否存在,必须在调用next()或rewind()方法之后才能调用这个方法

迭代器辅助函数:

iterator_to_array($iterator):这个函数可以接受任何迭代器,并且返回一个包含迭代器中所有数据的数组

iterator_count($iterator):返回迭代器中的元素数量值

iterator_apply($iterator, callback, [user data]):这个函数用来在迭代器中的每个元素上应用一个函数,它和在数组上使用array_walk()函数的方法时一样的。当回调函数返回TRUE时,循环回继续执行,否则退出循环。

数组重载:数组重载时将对象作为数组使用的一个过程。ArrayAccess接口是这一过程的核心,它提供了挂接Zend引擎所必须的的功能。

      在将对象当作数组使用时,允许对象的用法和数组一模一样是非常有用的。不过,ArrayAccess实现者自身并没有定义一个计数函数,不能和count()函数一起使用。这是因为并不是所有的ArrayAccess对象都具有固定的长度。但只要实现Countable接口,PHP的count()函数就可以正常使用了。

ArrayAccess接口方法:

offsetExists($offset):确定给定的偏移量是否存在于数组中

offsetSet($offset, $value):设置或替换给定偏移量上的数据

offsetGet($offset):返回给定偏移量位置上的数据

offsetUnset($offset):置空指定偏移量位置上的数据

观察者模式:观察者模式是一种非常简单的事件系统,包含两个或者更多的互相交互的类。这一模式允许某个类观察另外一个类的状态,当被观察者的状态发生变化时,这个模式就会得到通知。

在观察者模式中,被观察的类叫做subject,而负责观察的类叫做observer。SPL提供了SplSubject和SplObserver接口,其接口代码如下:

interface SplSubject

{

public function attach(SplObserver $observer);

public function detach(SplObserver $observer);

public function notify();

}

interface SplObserver

{

public function update(SplSubject $subject);

}

SplSubject类维护了一个特定的状态,当这个状态发生变化时,它就会调用notify()方法,所有之前使用attach()方法注册的SplObserver实例的update()方法都会被调用。

观察者模式的优点在于,挂接到订阅者上的观察者可多可少,并且不需要提前知道哪个类会响应subject类发出的事件。

序列化:SPL的Serializable接口为一些高级的序列化场景提供了支持,提供了大量高级序列化功能。非SPL的序列化魔术方法的__sleep和__wakeup有一些问题,这些问题在SPL接口中都得到了解决。

SPL自动加载功能是由spl_autoload()、spl_autoload_register()、spl_autoload_functions()、spl_autoload_extensions()和spl_autoload_call()等函数提供的。

对象标识符是由spl_object_hash()函数提供的,在同一次调用中对相同对象的引用可以保证对象标识符是完全相同的。