php spl 扩展,深入浅出 PHP SPL(PHP 标准库)

一、什么是spl库?

SPL是用于解决典型问题(standard problems)的一组接口与类的集合。

此扩展只能在php 5.0以后使用,从PHP 5.3.0 不再被关闭,会一直有效.成为php内核组件一部份。

SPL提供了一组标准数据结构。

二、SPL如何使用?

1.构建此扩展不需要其他扩展。

双向链表

双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。SplDoublyLinkedList implements Iterator , ArrayAccess , Countable {    /* 方法 */

public __construct ( void )

public void add ( mixed $index , mixed $newval )

public mixed bottom ( void )//双链表的尾部节点

public int count ( void )//双联表元素的个数

public mixed current ( void )//当前记录

public int getIteratorMode ( void ) //获取迭代模式

public bool isEmpty ( void )//检测双链表是否为空

public mixed key ( void )//当前节点索引

public void next ( void )//移到下条记录

public bool offsetExists ( mixed $index )//指定index处节点是否存在

public mixed offsetGet ( mixed $index )//获取指定index处节点值

public void offsetSet ( mixed $index , mixed $newval )//设置指定index处值

public void offsetUnset ( mixed $index )//删除指定index处节点

public mixed pop ( void )//从双链表的尾部弹出元素

public void prev ( void )//移到上条记录

public void push ( mixed $value )//添加元素到双链表的尾部

public void rewind ( void )//将指针指向迭代开始处

public string serialize ( void )//序列化存储

public void setIteratorMode ( int $mode )//设置迭代模式

public mixed shift ( void )//双链表的头部移除元素

public mixed top ( void )//双链表的头部节点

public void unserialize ( string $serialized )//反序列化

public void unshift ( mixed $value )//双链表的头部添加元素

public bool valid ( void )//检查双链表是否还有节点

}

接下来是使用方法:$list = new SplDoublyLinkedList();

$list->push('a');

$list->push('b');

$list->push('c');

$list->push('d');

$list->unshift('top');

$list->shift();

$list->rewind();//rewind操作用于把节点指针指向Bottom所在的节点

echo 'curren node:'.$list->current()."
";//获取当前节点

$list->next();//指针指向下一个节点

echo 'next node:'.$list->current()."
";

$list->next();

$list->next();

$list->prev();//指针指向上一个节点

echo 'next node:'.$list->current()."
";

if($list->current())

echo 'current node is valid
';

else

echo 'current node is invalid
';

if($list->valid())//如果当前节点是有效节点,valid返回true

echo "valid list
";

else

echo "invalid list 
";

var_dump(array(

'pop' => $list->pop(),

'count' => $list->count(),

'isEmpty' => $list->isEmpty(),

'bottom' => $list->bottom(),

'top' => $list->top()

));

$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);

var_dump($list->getIteratorMode());

for($list->rewind(); $list->valid(); $list->next()){

echo $list->current().PHP_EOL;

}

var_dump($a = $list->serialize());

//print_r($list->unserialize($a));

$list->offsetSet(0,'new one');

$list->offsetUnset(0);

var_dump(array(

'offsetExists' => $list->offsetExists(4),

'offsetGet' => $list->offsetGet(0),

));

var_dump($list);

//堆栈,先进后出

$stack = new SplStack();//继承自SplDoublyLinkedList类

$stack->push("a
");

$stack->push("b
");

echo $stack->pop();

echo $stack->pop();

echo $stack->offsetSet(0,'B');//堆栈的offset=0是Top所在的位置,offset=1是Top位置节点靠近bottom位置的相邻节点,以此类推

$stack->rewind();//双向链表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向Top所在的位置,而双向链表调用之后指向bottom所在位置

echo 'current:'.$stack->current().'
';

$stack->next();//堆栈的next操作使指针指向靠近bottom位置的下一个节点,而双向链表是靠近top的下一个节点

echo 'current:'.$stack->current().'
';

echo '
';

//队列,先进先出

$queue = new SplQueue();//继承自SplDoublyLinkedList类

$queue->enqueue("a
");//插入一个节点到队列里面的Top位置

$queue->enqueue("b
");

$queue->offsetSet(0,'A');//堆栈的offset=0是Top所在的位置,offset=1是Top位置节点靠近bottom位置的相邻节点,以此类推

echo $queue->dequeue();

echo $queue->dequeue();

echo "
";

堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现。根节点最大的堆叫做最大堆或大根堆(SplMaxHeap),根节点最小的堆叫做最小堆或小根堆(SplMinHeap)。二叉堆还常用于排序(堆排序)abstract SplHeap implements Iterator , Countable {

/* 方法 用法同双向链表一致 */

public __construct ( void )

abstract protected int compare ( mixed $value1 , mixed $value2 )

public int count ( void )

public mixed current ( void )

public mixed extract ( void )

public void insert ( mixed $value )

public bool isEmpty ( void )

public mixed key ( void )

public void next ( void )

public void recoverFromCorruption ( void )

public void rewind ( void )

public mixed top ( void )

public bool valid ( void )

}

使用方法://堆

class MySplHeap extends SplHeap{

//compare()方法用来比较两个元素的大小,绝对他们在堆中的位置

public function compare( $value1, $value2 ) {

return ( $value1 - $value2 );

}

}

$obj = new MySplHeap();

$obj->insert(0);

$obj->insert(1);

$obj->insert(2);

$obj->insert(3);

$obj->insert(4);

echo $obj->top();//4

echo $obj->count();//5

foreach ($obj as $item) {

echo $item."
";

}

阵列

优先队列也是非常实用的一种数据结构,可以通过加权对值进行排序,由于排序在php内部实现,业务代码中将精简不少而且更高效。通过SplPriorityQueue::setExtractFlags(int  $flag)设置提取方式可以提取数据(等同最大堆)、优先级、和两者都提取的方式。SplFixedArray implements Iterator , ArrayAccess , Countable {

/* 方法 */

public __construct ([ int $size = 0 ] )

public int count ( void )

public mixed current ( void )

public static SplFixedArray fromArray ( array $array [, bool $save_indexes = true ] )

public int getSize ( void )

public int key ( void )

public void next ( void )

public bool offsetExists ( int $index )

public mixed offsetGet ( int $index )

public void offsetSet ( int $index , mixed $newval )

public void offsetUnset ( int $index )

public void rewind ( void )

public int setSize ( int $size )

public array toArray ( void )

public bool valid ( void )

public void __wakeup ( void )

}

使用方法:$arr = new SplFixedArray(4);

$arr[0] = 'php';

$arr[1] = 1;

$arr[3] = 'python';//遍历, $arr[2] 为null

foreach($arr as $v) {

echo $v . PHP_EOL;

}

//获取数组长度

echo $arr->getSize(); //4

//增加数组长度

$arr->setSize(5);

$arr[4] = 'new one';

//捕获异常

try{

echo $arr[10];

} catch (RuntimeException $e) {

echo $e->getMessage();

}

映射

用来存储一组对象的,特别是当你需要唯一标识对象的时候。SplObjectStorage implements Countable , Iterator , Serializable , ArrayAccess {

/* 方法 */

public void addAll ( SplObjectStorage $storage )

public void attach ( object $object [, mixed $data = NULL ] )

public bool contains ( object $object )

public int count ( void )

public object current ( void )

public void detach ( object $object )

public string getHash ( object $object )

public mixed getInfo ( void )

public int key ( void )

public void next ( void )

public bool offsetExists ( object $object )

public mixed offsetGet ( object $object )

public void offsetSet ( object $object [, mixed $data = NULL ] )

public void offsetUnset ( object $object )

public void removeAll ( SplObjectStorage $storage )

public void removeAllExcept ( SplObjectStorage $storage )

public void rewind ( void )

public string serialize ( void )

public void setInfo ( mixed $data )

public void unserialize ( string $serialized )

public bool valid ( void )

}

使用方法:class A {

public $i;

public function __construct($i) {

$this->i = $i;

}

}

$a1 = new A(1);

$a2 = new A(2);

$a3 = new A(3);

$a4 = new A(4);

$container = new SplObjectStorage();

//SplObjectStorage::attach 添加对象到Storage中

$container->attach($a1);

$container->attach($a2);

$container->attach($a3);

//SplObjectStorage::detach 将对象从Storage中移除

$container->detach($a2);

//SplObjectStorage::contains用于检查对象是否存在Storage中

var_dump($container->contains($a1)); //true

var_dump($container->contains($a4)); //false

//遍历

$container->rewind();

while($container->valid()) {

var_dump($container->current());

$container->next();

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
详细描述:内容简介本书采用循序渐进的方式介绍了用PHP 进行Web 开发的相关知识。书中首先从OOP 采用的机制—— 抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHPSPL 方面的知识以及PHP 开发人员最有可能用到的MVC 模式,最后介绍了Ajax 、JSON 、SOAP Web 服务以及SSL 客户端验证等Web 2.0 方面的内容。本书适合中、高级的PHP 程序员阅读。媒体评论 “很长时间没有看到这样有价值的PHP高级图书了,我从本书中获益匪浅。强烈推荐!”                   ——Quentin Zervaas,资深PHP程序员,《PHP Web 2.0开发实战》一书作者  “本书是我读过的最好的技术书,推荐阅读。”                   ——Amazon.com 目录第一部分 OOP和模式 第1章 抽象类、接口和契约式编程 第2章 静态变量、成员和方法 第3章 单例模式和工厂模式 第4章 异常 第5章 PHP 6中的新特性第二部分 测试和文档编写 第6章 文档编写和编码规范 第7章 反射API  第8章 测 试、部署和持续集成第三部分 SPL(标准PHP库) 第9章 SPL简介 第10章 SPL迭代器 第11章 SPL文件和目录处理 第12章 SPL数组重载 第13章 SPL异常第四部分 MVC模式 等 。。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值