#什么是SPL
SPL是Standard PHP Library(PHP标准库)的缩写。SPL包括以下内容
1. 数据结构
2. 迭代器
3. 基础接口
4. 异常
4. SPL函数
5. 文件处理
#SPL数据结构
虽然我们可以使用传统的变量类型来描述数据结构,例如用数组来描述堆栈(Strack)-- 然后使用对应的方式 pop 和 push(arraypop()、arraypush()),但你得时刻小心,·因为毕竟它们不是专门用于描述数据结构的 -- 一次误操作就有可能破坏该堆栈。现在,有了SPL,就可以实现我们需要的数据结构
##双向链表
双向链表的代码使用如下,更多详细信息可以参考:http://php.net/manual/zh/class.spldoublylinkedlist.php
```
/**
* 双向链表
*/
$obj = new SplDoublyLinkedList();
$obj->push('yongxiong');//插入到顶部
$obj->unshift('hahaha');//插入到底部
$obj->rewind();//把指针指向底部
echo $obj->current();//取出当前元素 hahaha
$obj->next();//把指针指向下一个节点
echo $obj->current();//yongxiong
$obj->prev();//把指针指向上一个节点
echo $obj->current();//hahahaha
```
##栈
注意,栈是双向链表的一个特例(继承双向链表),包括队列也是双向队列的一个特例。栈的代码操作实例,详细的SQL栈讲解:http://php.net/manual/zh/class.splstack.php
```
$obj = new SplStack();
$obj->push(0);//进栈 等同于$obj[] = 0
$obj->push(1);//进栈 等同于$obj[] = 1
echo $obj->pop();//出栈 ,输出1
```
##队列
队列也是继承双向链表,队列的代码实例,详细的队列的讲解:http://php.net/manual/zh/class.splqueue.php
```
$obj = new SplQueue();
$obj->enqueue(0);//对队列
$obj->enqueue(1);//进队列
echo $obj->dequeue();//出队列 输出0
```
除了这些我们常用的三种数据结构,SPL还帮我们实现了其他的数据结构类型,这里不一一举例了,详细信息:http://php.net/manual/zh/spl.datastructures.php
#SPL迭代器
迭代是常见设计模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了所有你需要的对应数据类型的迭代器。包括数组遍历,文件遍历等等
##ArrayIterator 数组迭代器
一般我们在遍历一个数组的时候,都是用php现成的函数,比如foreach。但是,有时候我们需要粒度更细的操作数组的时候,可以自己实现数组迭代
```
$fruits = array(
"apple" => "yummy",
"orange" => "ah ya, nice",
);
//获取数组迭代器$it
$obj = new ArrayObject( $fruits );
$it = $obj->getIterator();
//使用迭代器遍历
$it->rewind();
while ($it->valid()){
echo $it->key()."=".$it->current()."
";
$it->next();
}
```
##FilesystemIterator 文件迭代器
可以使用PHP中SPL提供的迭代器遍历文件,比如以下例子列出当前目录下的文件和目录,模仿linux中`ls -al`操作
```
//获取文件系统的迭代器
$it = new FilesystemIterator('.');
//遍历当前文件
foreach ($it as $fileInfo){
$fileName = $fileInfo->getFilename();
$lastModifyTime = date("Y-m-d H:i:s", $fileInfo->getMTime());
$isDir = $fileInfo->isDir() ? "DIR" : '';
$size = $fileInfo->getSize();
echo $fileName . ' '. $lastModifyTime. " ". $isDir . " ". $size ."
";
}
```
除了以上两种迭代器,SPL还提供了很多其他的迭代器,具体参考:http://php.net/manual/zh/spl.iterators.php
#SPL接口
SPL基础接口里面定义了下面四个最常用的接口
1. Countable
2. OuterIterator
3. RecursiveIterator
4. SeekableIterator
这里举一个例子,比如 ,你可以实现一个类的count函数操作,就必须让这个类实现Countable接口
##Countable接口
普通情况下,我们定义一个类,是不能使用count操作的。但是我们可以通过以下方式实现一个类的count操作
```
class NoteList implements Countable{
protected $listCount = 3;
public function count(){
return $this->listCount;
}
}
$myNoteList = new NoteList();
echo count($myNoteList);//3
```
更多SPL接口的介绍:http://php.net/manual/zh/spl.interfaces.php
#SPL基本函数
##spl_autoload_register
SPL是PHP标准库,同样我们可以采用SPL提供的函数库的方式实现自动装载,我们只需要注册自动状态的时候检索的路劲和后缀名称。加入我们将以下文件命名为index.php,然后在index.php的同级目录中的libs有User.class.php文件
`index.php`
```
spl_autoload_extensions('.class.php');//注册搜索后缀
set_include_path(get_include_path().PATH_SEPARATOR.'libs/');//注册搜索路径
spl_autoload_register();//注册spl_autoload自动装方式
new User();
```
`./libs/User.class.php`
```
class User{
function __construct(){
echo "User类被自动装载了!";
}
}
```
当运行这段代码的时候,虽然没有进行`User`类的引入,当这段代码已经可以正常执行了
```
localhost:autoload MLS$ php index.php
User类被自动装载了!
```
##class_implements
返回指定的类实现的所有接口
```
interface foo { }
class bar implements foo {}
print_r(class_implements(new bar)); //foo
```
SPL还实现了很多其他的函数:http://php.net/manual/zh/ref.spl.php
#SPL文件处理
在文件处理中
1. SplFileInfo用户获取文件的基本信息,比如修改时间,拥有者
2. SplFileObject用户操作文件,比如文件的读取,写入
##SplFileInfo
获取文件的基本属性信息,包括文件的创建时间,修改时间,文件大小等等
```
$file = new SplFileInfo('test.txt');
echo $file->getCTime();//获取文件创建时间
echo $file->getMTime();//获取文件修改时间
```
##SplFileObject
操作文件信息,包括文件的读取,写入等
```
$file = new SplFileObject('test.txt');
//读取
while ($file->valid()){
echo $file->fgets();
}
```
更多文件写入包括删除的接口:http://php.net/manual/zh/class.splfileobject.php
#SPL异常
http://php.net/manual/zh/spl.exceptions.php