深入浅出 PHP SPL(PHP 标准库)(转)

一、什么是spl库?

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

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

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

二、SPL如何使用?

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

更详细的情况可参考 http://php.net/manual/zh/spl.datastructures.php

双向链表

双链表是一种重要的线性存储结构,对于双链表中的每个节点,不仅仅存储自己的信息,还要保存前驱和后继节点的地址。

SplDoublyLinkedList

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()."<br />";//获取当前节点

$list->next();//指针指向下一个节点
echo ‘next node:‘.$list->current()."<br />";

$list->next();
$list->next();
$list->prev();//指针指向上一个节点
echo ‘next node:‘.$list->current()."<br />";

if($list->current())
    echo ‘current node is valid<br />‘;
else
    echo ‘current node is invalid<br />‘;

if($list->valid())//如果当前节点是有效节点,valid返回true
    echo "valid list<br />";
else
  echo "invalid list <br />";

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<br />");
$stack->push("b<br />");

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().‘<br />‘;
$stack->next();//堆栈的next操作使指针指向靠近bottom位置的下一个节点,而双向链表是靠近top的下一个节点
echo ‘current:‘.$stack->current().‘<br />‘;
echo ‘<br /><br />‘;

//队列,先进先出
$queue = new SplQueue();//继承自SplDoublyLinkedList类
$queue->enqueue("a<br />");//插入一个节点到队列里面的Top位置
$queue->enqueue("b<br />");
$queue->offsetSet(0,‘A‘);//堆栈的offset=0是Top所在的位置,offset=1是Top位置节点靠近bottom位置的相邻节点,以此类推
echo $queue->dequeue();
echo $queue->dequeue();
echo "<br /><br />";

堆(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."<br />";
}

阵列

优先队列也是非常实用的一种数据结构,可以通过加权对值进行排序,由于排序在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();
}

原文地址:http://www.imooc.com/article/34286

原文地址:https://www.cnblogs.com/wscsq789/p/12005689.html

时间: 2024-12-31 05:20:34

深入浅出 PHP SPL(PHP 标准库)(转)的相关文章

SPL(PHP标准库)-----------------------个人笔记

<?php     ****************************************PHP高级程序员必修课******************************************************* //SPL:PHP标准库,Standand  PHP  Library   解决常见问题的一组接口与类的集合 /* 问题:数学建模/数据结构,解决数据如何存储的问题 元素便利,数据如何查看的问题 常用方法的统一调用(通用方法,自定义遍历) 类定义的自动装载 */ /

PHP标准库 SPL

PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供自己参考的笔记,不是教程,所以写得比较简单,没有多解释.但是我想,如果你是一个熟练的PHP5程序员,应该足以看懂下面的材料,而且会发现它很有用.现在除此之外,网上根本没有任何深入的SPL中文介绍. ================ PHP SPL笔记 目录 第一部分 简介 1. 什么是SPL? 2.

PHP 设计模式 笔记与总结(3)SPL 标准库

SPL 库的使用(PHP 标准库) 1. SplStack,SplQueue,SplHeap,SplFixedArray 等数据结构类 ① 栈(SplStack)(先进后出的数据结构) index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_register('\\Common\\Loader::autoload'); $stack = new

使用php标准库spl在实现观察者模式

上次使用了纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者! <?php /** * Created by PhpStorm. * User: evolution * Date: 14-12-27 * Time: 下午5:50 */ class Login implements SplSubject { private $storage; public $status; public $ip; const LOG

【夯实PHP基础】PHP标准库 SPL

PHP SPL笔记 这几天,我在学习PHP语言中的SPL. 这个东西应该属于PHP中的高级内容,看上去很复杂,但是非常有用,所以我做了长篇笔记.不然记不住,以后要用的时候,还是要从头学起. 由于这是供自己参考的笔记,不是教程,所以写得比较简单,没有多解释.但是我想,如果你是一个熟练的PHP5程序员,应该足以看懂下面的材料,而且会发现它很有用.现在除此之外,网上根本没有任何深入的SPL中文介绍. ================ PHP SPL笔记 目录 第一部分 简介 1. 什么是SPL? 2.

PHP 标准库 SPL 之数据结构栈(SplStack)简单实践

PHP 5.3.0 版本及以上的堆栈描述可以使用标准库 SPL 中的 SplStack class,SplStack 类继承双链表 ( SplDoublyLinkedList ) 实现栈. 代码: 1 <?php 2 header("Content-type:text/html; charset=utf-8"); 3 4 $stack = new SplStack(); 5 6 //LIFO 7 echo 'stack push',PHP_EOL; 8 9 //入栈 10 $st

3.2 标准库类型string(上)

#include <string> #include <iostream> using std::string; using std::cin; using std::cout; using std::endl; //string定义在命名空间std中 int main() { /**************3.2.1 定义和初始化string*****************/ string s1; //默认初始化,S1是一个空字符串 string S2 = s1; //S2时S

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

C++温习-标准库-set

set,就是集合,其满足唯一性, C++中的标准库set是一个类模板, template < class T, // set::key_type/value_type class Compare = less<T>, // set::key_compare/value_compare class Alloc = allocator<T> // set::allocator_type > class set; 正常使用需要提供类别参数如 set<string>

Django的标准库django.contrib包介绍

前面我们激活了 Django 后台,我们要使用自动化的站点管理工具(django.contrib.admin),所以最好对Django.contrib进行了解,它是啥?它是一个强大的功能包,是Django的标准库. Django的标准库存放在 django.contrib 包中.每个子包都是一个独立的附加功能包. 这些子包一般是互相独立的,不过有些django.contrib子包需要依赖其他子包. 在 django.contrib 中对函数的类型并没有强制要求 .其中一些包中带有模型(因此需要你