那一天,人们终于回想起了被BUG支配的恐惧
Toggle navigation
Home
AboutMe
Links
Archives
Tags
什么是SPL
2016-07-10 11:59:46
500
0
0
weibo-007
#什么是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 ``` <?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 ``` <?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 ``` <?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。但是,有时候我们需要粒度更细的操作数组的时候,可以自己实现数组迭代 ``` <?php $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()."<br>"; $it->next(); } ``` ##FilesystemIterator 文件迭代器 可以使用PHP中SPL提供的迭代器遍历文件,比如以下例子列出当前目录下的文件和目录,模仿linux中`ls -al`操作 ``` <?php //获取文件系统的迭代器 $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 ."<br>"; } ``` 除了以上两种迭代器,SPL还提供了很多其他的迭代器,具体参考:http://php.net/manual/zh/spl.iterators.php #SPL接口 SPL基础接口里面定义了下面四个最常用的接口 1. Countable 2. OuterIterator 3. RecursiveIterator 4. SeekableIterator 这里举一个例子,比如 ,你可以实现一个类的count函数操作,就必须让这个类实现Countable接口 ##Countable接口 普通情况下,我们定义一个类,是不能使用count操作的。但是我们可以通过以下方式实现一个类的count操作 ``` <?php 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` ``` <?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 返回指定的类实现的所有接口 ``` <?php 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 获取文件的基本属性信息,包括文件的创建时间,修改时间,文件大小等等 ``` <?php $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
Pre:
认识微服务
Next:
PHP匿名函数,闭包
0
likes
500
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.