php中的spl,PHP中SPL使用

#什么是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 . '&nbsp'. $lastModifyTime. "&nbsp". $isDir . "&nbsp". $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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值