文档章节

PHP SPL的使用

eatnothing
 eatnothing
发布于 2015/10/26 15:09
字数 888
阅读 4424
收藏 112

在许多框架和MVC中都能够看到PHP SPL的身影, PHP SPL 在很多实际应用都占了很大的比重

双向链表

<?php
$obj = new SplDoublyLinkedList();
$obj->push(1);
$obj->push(2);
$obj->push(3);
$obj->unshift(10);   //unshifit 替换双向链表的首部
$obj->rewind();     //  使用current 必须调用rewind,把节点指针指向bottom节点
 $obj->next();    //    next 指向下一个节点
$obj->prev();   // 指针指向上一个节点
echo $obj->current();   //  指针指向当前结点
if($obj->current())
{
    echo "y";
}else{
    echo "n";
}

    if($obj->valid()){
        //如果当前节点是有效节点 valid则返回true
    }
$obj->pop();  
    //var_dump($obj);
print_r($obj);

 

堆栈的使用

<?php
$stack = new SplStack();  //实例化堆栈
$stack->push("a");        //向堆栈中加入数据
$stack->push("b");
$stack->push("c");
/*
$stack->offsetSet(0,'C');  //堆栈的节点0是top 的节点,设置节点的值
$stack->rewind(); //双向链表的rewind和堆栈的rewind相反,堆栈的rewind使得当前指针指向TOP所在的位置,而双向链表调用之后指向bottom所在的位置


echo "qq".$stack->next();  // 堆栈的next与双向链表相反
echo "re".$stack->current()."</br>";
//echo "bo".$stack->bottom()."</br>";
//echo "top".$stack->top();

print_r($stack);
*/
//从TOP开始遍历
$stack->rewind();
while($stack->valid()){
    echo $stack->key()."=>".$stack->current()."</br>";
    $stack->next();
}
$pop = $stack->pop();
echo $pop;
//pop操作从堆栈里面提取出的最后一个元素(TOP位置),同时在堆栈删除该节点

 

队列

$que = new SplQueue();
$que->enqueue("a");    //    入队列
$que->enqueue("b");
$que->enqueue("c");

//print_r($que);
echo "bottom".$que->bottom()."</br>";
echo "top".$que->top();
$que->rewind();  
$que->dequeue();    //出队列
//从 bottom 位置删除
print_r($que);

 

ArrayIterator

<?php
$fruits = array(
    "apple"  => "apple value",
    "orange" => "orange value",
    "grape" => "grape value"
);                //定义一个水果数组

$obj = new ArrayObject($fruits);
$it = $obj->getIterator();
    //  用foreach 实现遍历数组
foreach($it as $key => $value){

    echo $key."->".$value."</br>";
}

$it->rewind();  //必须要 rewind
//用 while 来遍历数组
while($it->valid()){

    echo $it->key()."->".$it->current()."</br>";
     $it->next();
}
//跳过某些元素进行打印
$it->rewind();
if($it->valid()){

    $it->seek(1); //寻找到1的元素
    while($it->valid()){

        echo $it->key()."->".$it->current()."</br>";
        $it->next();
    }

}
echo "</br>";
$it->rewind();
//$it->ksort();  //进行排序  用key ,
//$it->rewind();
$it->asort(); //按value 进行排序
while($it->valid()){

    echo $it->key()."->".$it->current()."</br>";
    $it->next();
}

 

AppendIterator

<?php
$array_a = new ArrayIterator(array('a','b','c'));  //定义两个 ArrayIterator
$array_b = new ArrayIterator(array('d','e','f'));
$it = new AppendIterator();
$it->append($array_a);        //  将ArrayIterator追加到Iterator里
$it->append($array_b);
foreach($it as $key => $value){

    echo $key."||".$value."</br>";
}
//通过APPEND方法把迭代器对象添加到AppendIterator对象中
//把两个数组的 数值添加到一个Interator

 

MultipleIterator 将数组组合成整个输出

$idIter = new ArrayIterator(array('01','02','03'));
$nameIter =  new ArrayIterator(array('qq','ss','show'));

$mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$mit->attachIterator($idIter,"id");
$mit->attachIterator($nameIter,"name");

foreach($mit as $value){

    print_r($value);

}

 

File文件,打印出当前文件夹文件的名称

date_default_timezone_get('PRC');
$it = new FilesystemIterator('.');
foreach($it as $value){
    echo date("Y-m-d H:i:s",$value->getMtime())."</br>";
    $value->isDir()?"<dir>":"";
    number_format($value->getSize());
    echo $value->getFileName();
}

 

IteratorIterator

$array=array('value1','value2','value3','value4','value5');
$out = new Outer(new ArrayIterator($array));
foreach($out as $key => $value){
    echo $key."||".$value."</br>";
}

    class Outer extends IteratorIterator{
        public function current(){
            return parent::current()."why";
        }
        public function key(){
            return parent::current()."not";
        }
    }
//可以定制key和value 的值

 

打印对象的值

class Count implements Countable{

    protected  $mycount = 4;
    public function count(){
        return $this->mycount;
    }
}

$count  = new Count();
echo count($count);

 

autoload机制

spl_autoload_extensions('.class.php,.php'); //设定以什么扩展名结尾
set_include_path(get_include_path().PATH_SEPARATOR."autoload/"); //设定文件的目录
spl_autoload_register();
new test();
///spl_autoload_register('')可以自定义

//比如我有一个文件在 文件夹 autoload下
class test{
    public function __construct(){
        echo " this is test.class.php";
    }
}

 

SPLFILE //对文件的操作

date_default_timezone_set('PRC');
$file = new SplFileInfo('qq.txt');
echo "file is create at".date("Y-m-d H:i:s",$file->getCTime())."</br>";
echo "file is modified at".date("Y-m-d H:i:s",$file->getMTime())."</br>";
echo "file size".$file->getSize()."kb</br>";


$fileObj = $file->openFile("r");
while($fileObj->valid()){
    echo $fileObj->fgets();
}
$fileObj = null;
$file = null;

 

 

© 著作权归作者所有

eatnothing
粉丝 39
博文 128
码字总数 68736
作品 0
昌平
程序员
私信 提问
加载中

评论(15)

金三胖
金三胖

引用来自“开源中国首席骨科主任”的评论

SPL是什么啊。。看来我知识太浅了

我也是21
hylent
hylent
SplFixedArray 这个在构建大数量的数组时有点用 一次分配足够内存 比array push 快

其它的数据结构,每次请求之后都销毁的情况下,没什么卵用啊,下次还有重建,多麻烦。而且spl这些数据结构能解决的问题,array本身也大多能解决。

如果用swoole的话,让他们常驻内存,可能会有用吧。就怕会有内存泄漏等别的问题了。
南漂一卒
南漂一卒

引用来自“隐形人”的评论

感觉很多都可以用数组来实现啊 为什么还要选择SPL呢

PHP 原生数据类型 那些又多又长、风格不一的全局函数 用起来真蛋疼…… 遇到递归更蛋疼…… 34 SPL 除了类名长点,完全的面向对象风格 让业务代码可以很简洁~(比如 遍历一个非空目录树)
海诺者
海诺者

引用来自“开源中国首席骨科主任”的评论

SPL是什么啊。。看来我知识太浅了

不是你知识太浅,是这些东西然并卵,因为我到现在没看到有哪个框架里面真正用过spl而且,这个spl也没有广泛运用的基础,在对栈和堆操作时,别人要么选择了Java要么就是c c++
不是simaguo
不是simaguo
php 标准库中的队列、链表、堆栈啊,不能常驻内存吧,不知道有什么用
eatnothing
eatnothing 博主

引用来自“巴小杰”的评论

双链表的unshift和pop中文注释是对的吗?

引用来自“hentai”的评论

特意回去运行了一下 没有错啊

引用来自“聽雨人”的评论

我也觉得不对,pop是链表尾,unshift是头。你应该说反了。
确实是错了 ,查了一下php Document 写的是Prepends value at the beginning of the doubly linked list. 已改正
eatnothing
eatnothing 博主

引用来自“hylent”的评论

然并卵
为什么然并卵呢,我觉得很有用啊
hylent
hylent
然并卵
阳光test
阳光test

引用来自“开源中国首席骨科主任”的评论

SPL是什么啊。。看来我知识太浅了
standard php libaray,类似c++的STL
金拱门
金拱门
SPL是什么啊。。看来我知识太浅了
PHP的autoLoad自动加载机制 的几种方式

说说PHP的autoLoad自动加载机制 php的autoload大致可以使用两种方法:autoload和spl方法。这两种方法又各有不同的几种使用方法 autoload的使用方法1: 最经常使用的就是这种方法,根据类名,...

daniel-john
2015/08/27
66
0
类自定载入

为什么需要类自动加载机制 原因: 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来。这个在小规模开发的时候,没什么大问...

金于虎
2016/11/15
8
0
PHP中spl_autoload_register函数的用法

splautoloadregister (PHP 5 >= 5.1.2) splautoloadregister — 注册autoload()函数 说明 bool splautoloadregister ([ callback $autoload_function ] ) 将函数注册到SPL autoload函数栈中。......

121137141
2013/04/10
88
0
PHP中spl_autoload_register函数的用法

PHP中splautoloadregister函数的用法 splautoloadregister (PHP 5 >= 5.1.2) splautoloadregister — 注册autoload()函数 说明 bool splautoloadregister ([ callback $autoload_function ] ......

net ljx
2012/10/25
63
0
PHP基础学习之SPL Autoload机制

PHP基础学习之SPL Autoload机制 果冻想2018-03-172 阅读 PHP 前言 上一篇文章总结了PHP中的 机制。这一篇是上一篇的姊妹篇。关于 现在基本都被抛弃了,使用的越来越少了,但是语言的发展都是...

果冻想
2018/03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
32分钟前
3
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
9
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部