在许多框架和MVC中都能够看到PHP SPL的身影, PHP SPL 在很多实际应用都占了很大的比重
双向链表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?php
$obj
=
new
SplDoublyLinkedList();
$obj
->push(1);
$obj
->push(2);
$obj
->push(3);
$obj
->unshift(10);
//unshifit 占用了底部最后一个元素,把新的节点添加到了链表的底部(Bottom)
$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
);
|
堆栈的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?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位置),同时在堆栈删除该节点
|
队列
1
2
3
4
5
6
7
8
9
10
11
12
|
$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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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 将数组组合成整个输出
1
2
3
4
5
6
7
8
9
10
11
12
|
$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文件,打印出当前文件夹文件的名称
1
2
3
4
5
6
7
8
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$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 的值
|
打印对象的值
1
2
3
4
5
6
7
8
9
10
|
class
Count
implements
Countable{
protected
$mycount
= 4;
public
function
count
(){
return
$this
->mycount;
}
}
$count
=
new
Count
();
echo
count
(
$count
);
|
autoload机制
1
2
3
4
5
6
7
8
9
10
11
12
|
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 //对文件的操作
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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;
|