PHP SPL 学习笔记

一 预定义接口

1.1 遍历

Traversable(遍历)接口

检测一个类是否可以被foreach遍历,该接口不能被单独的实现,只能由Iterator或IteratorAggregate实现。这是一个无法在 PHP 脚本中实现的内部引擎接口。IteratorAggregateIterator接口可以用来代替它。

接口摘要:

Traversable{

}

这个接口没有任何方法,它的作用仅仅是作为所有可遍历类的基本接口。

1.2 Iterator(迭代器)接口

一个类的内部迭代自己的接口

接口摘要:

Iterator extends Traversable{

/* 方法 */

abstract public mixed current(void) //返回当前元素

abstract public scalar key(void) //返回当前元素的键

abstract public void next(void) //向前移动到下一个元素

abstract public void rewind(void) //返回到迭代器的第一个元素

abstract public boolean valid(void) //检查当前位置是否有效

}

示例:

class IteratorDemo implements Iterator, Countable

{

public $items = ['jason', 'jude', 'lisy'];

public $position;

public function __construct()

{

$this->position = 0;

}

// Countable接口的抽象方法

public function count()

{

return count($this->items);

}

//Iterator里定义的抽象的方法

public function current()

{

return $this->items[$this->position];

}

public function key()

{

return $this->position;

}

public function next()

{

++$this->position;

}

public function rewind()

{

$this->position = 0;

}

public function valid()

{

return isset($this->items[$this->position]);

}

}

spl 已为我们实现了常见的迭代器:

ArrayIterator

FilterIterator

InfiniteIterator

LimitIterator

DirectoryIterator(extendsSplFileInfo)

1.3 IteratorAggregate(聚合式迭代器)接口

创建外部迭代器的接口

接口摘要:

IteratorAggregate extends Traversable{

/* 方法 */

abstract public Traversable getIterator(void)

}

示例:

class IteratorAggregateDemo implements IteratorAggregate 

{

public $name = 'jason';

private $age = 18;

public $hobit = 'basketball';

//实现IteratorAggregate接口里的抽象方法

public function getIterator()

{

return new ArrayIterator($this);

}

}

1.4 ArrayAccess(数组式访问)接口

提供像访问数组一样访问对象的能力的接口

接口摘要

ArrayAccess{

/* 方法 */

abstract public boolean offsetExists(mixed $offset) // 检查一个偏移位置是否存在,调用isset,empty时调用

abstract public mixed offsetGet(mixed $offset) // 获取一个偏移位置的值

abstract public void offsetSet(mixed $offset,mixed $value) // 设置一个偏移位置的值

abstract public void offsetUnset(mixed $offset) //复位一个偏移位置的值

}

示例:

class ArrayAccessDemo implements ArrayAccess

{

public $name;

public  $age;

public $habit;

public function __construct($name, $age, $habit)

{

$this->name = $name;

$this->age = $age;

$this->habit = $habit;

}

public function offsetExists($offset)

{

if (array_key_exists($offset, get_object_vars($this))) {

return true;

} else {

return false;

}

}

public function offsetSet($offset, $value)

{

if ($this->offsetExists($offset)) {

$this->$offset = $value;

}

}

public function offsetGet($offset)

{

if ($this->offsetExists($offset)) {

return $this->$offset;

}

}

public function offsetUnset($offset)

{

if ($this->offsetExists($offset)) {

unset($this->$offset);

}

}

}

1.5 序列化接口

序列化和反序列化一个对象,实现此接口的类将不再支持__sleep()__wakeup()

接口摘要:

Serializable{

/* 方法 */

abstract public string serialize(void) // serialize一个对象时调用

abstract public mixed unserialize(string $serialized) //unserialize一个对象时调用

}

示例:

class Pot implements Serializable

{

protected $_a;

protected $_b;

public function serialize()

{

return serialize(get_object_vars($this));

}

public function unserialize($data)

{

$values = unserialize($data);

foreach ($values as $key=>$value) {

$this->$key = $value;

}

}

}

1.6 Closure 类

用于代表匿名函数的类

接口摘要:

Closure {

/* 方法 */

__construct ( void )  //用于禁止实例化的构造函数

public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) //复制一个闭包,绑定指定的$this对象和类作用域

public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] ) //复制当前闭包对象,绑定指定的$this对象和类作用域

}


示例:

class A{

function__construct($val) {

val = $val;

}

function getClosure() {

//returns closure bound to this object and scope

return function() { return $this->val; };

}

}

$ob1 = new A(1);

$ob2 = new A(2);

$cl = $ob1->getClosure();

echo $cl(), "\n";

$cl = $cl->bindTo($ob2);

echo $cl(), "\n";

?>

1.7 生成器类

生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现Iterator接口的方式,性能开销和复杂性大大降低。生成器允许你在foreach代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要yield多次,以便生成需要迭代的值。

接口摘要:

Generator implements Iterator {

/* 方法 */

public mixed current ( void ) //返回当前产生的值

public mixed key ( void ) //返回当前产生的键

public void next ( void ) //生成器继续执行

public void rewind ( void ) //重置迭代器

public mixed send ( mixed $value ) //向生成器中传入一个值

public void throw ( Exception $exception ) //向生成器中抛入一个异常

public bool valid ( void ) //检查迭代器是否被关闭

public void __wakeup ( void ) //序列化回调

}

对象不能通过new实例化.

示例:

functionfib($n)

{

$cur=1;

$prev=0;

for ($i=0;$i<$n;$i++) {

yield $cur;

$temp=$cur;

$cur=$prev+$cur;

$prev=$temp;

}

}

$fibs = fib(9); //函数调用,返回一个Generator对象

foreach ($fibs as $fib) {

echo " ".$fib;

generator对象被迭代时,会被多次的调用,每次调用会继续执行yield后面的代码,遇到yield返回yield指定的对象。

二 SPL 函数

class_implements— 返回指定的类实现的所有接口。

usage: array class_implements(mixed $class [,bool $autoload] )

说明:本函数返回一个数组,该数组中包含了指定类class及其父类所实现的所有接口的名称。

参数:

$class: 对象(类实例)或字符串(类名称)

$autoload: 是否允许使用__autoload魔术函数来自动装载该类。默认值为TRUE


class_parents— 返回指定类的父类。

Usage: array class_parents ( mixed $class [, bool $autoload ] )

说明: 本函数返回一个包含了指定类class父类名称的数组.

参数:

$class: 对象(类实例)或字符串(类名称)

$autoload: 是否允许使用__autoload魔术函数来自动装载该类。默认值为TRUE


class_uses— 返回一个类使用的trait

iterator_apply— 为迭代器中每个元素调用一个用户自定义函数

Usage: int iterator_apply ( Traversable $iterator , callable $function [, array $args ] )

说明:

循环迭代每个元素时调用某一回调函数

参数说明:

$iterator 需要循环迭代的类对象

$function 循环迭代时调用的方法, (注意:如果没有返回值或返回false,回调方法只会执行一次)

$args  传给回调方法的参数


iterator_count— 计算迭代器中元素的个数

Usage: int iterator_count ( Traversable $iterator )


iterator_to_array— 将迭代器中的元素拷贝到数组

Usage: array iterator_to_array ( Traversable $iterator [, bool $use_keys = true ] )

说明:

将迭代器中的元素拷贝到数组

参数说明:

$iterator 被拷贝的迭代器

$use_keys 是否使用迭代器中的key作为数组的key,默认true, (false 数字索引作为数组的key)


spl_autoload_call— 尝试调用所有已注册的__autoload()函数来装载请求类

Usage: void spl_autoload_call ( string $class_name )

说明:

可以直接在程序中手动调用此函数来使用所有已注册的__autoload函数装载类或接口

参数说明:

$class_name 搜索的类名


spl_autoload_extensions— 注册并返回spl_autoload函数使用的默认文件扩展名。

Usage: string spl_autoload_extensions ([ string $file_extensions ] )

说明:

本函数用来修改和检查__autoload()函数内置的默认实现函数spl_autoload()所使用的扩展名

参数说明:

$file_extensions  当不使用任何参数调用此函数时,它返回当前的文件扩展名的列表,不同的扩展名用逗号分隔。要修改文件扩展名列表,用一个逗号分隔的新的扩展名列表字符串来调用本函数即可。中文注:默认的spl_autoload函数使用的扩展名是".inc,.php"


spl_autoload_functions— 返回所有已注册的__autoload()函数。

Usage: array spl_autoload_functions ( void )

说明:

获取所有已注册的 __autoload() 函数

返回说明:

包含所有已注册的__autoload函数的数组(array)。如果自动装载函数栈未激活,则返回FALSE。如果没有已注册的函数,则返回一个空数组


spl_autoload_register— 注册给定的函数作为 __autoload 的实现

Usage: bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

说明:

将函数注册到SPL  __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload函数队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()。如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

参数说明:

$autoload_function 欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()

$throw 此参数设置了autoload_function无法成功注册时,spl_autoload_register()是否抛出异常

$prepend 如果是 true,spl_autoload_register()会添加函数到队列之首,而不是队列尾部.默认会添加到队列之尾。


spl_autoload_unregister— 注销已注册的__autoload()函数

Usage: bool spl_autoload_unregister ( mixed $autoload_function )

说明:

从spl提供的自动装载函数栈中注销某一函数。如果该函数栈处于激活状态,并且在给定函数注销后该栈变为空,则该函数栈将会变为无效。如果该函数注销后使得自动装载函数栈无效,即使存在有__autoload函数它也不会自动激活

参数说明:

$autoload_function 需要注销的自动加载函数


spl_autoload— __autoload()函数的默认实现

Usage: void spl_autoload ( string $class_name [, string $file_extensions ] )

说明:

本函数提供了__autoload()的一个默认实现。如果不使用任何参数调用 spl_autoload_register() 函数,则以后在进行 __autoload() 调用时会自动使用此函数。

参数说明:

$class_name 搜索的类名

$file_extensions  自动加载的文件的扩展名


spl_classes— 返回所有可用的SPL类

spl_object_hash— 返回指定对象的hash id

Usage: string spl_object_hash ( object $obj )

说明:

本函数为指定对象返回一个唯一标识符。这个标识符可用于作为保存对象或区分不同对象的hash key。

参数说明:

$object 具体对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • /* 【数组函数】 */ //统计计算 count计算数组中的单元数目或对象中的属性个数 array_count_...
    Omit03阅读 300评论 0 2
  • 01. 2015年7月20日是改变女孩大学生涯的起点,这一天她发现自己怀孕了。那一年她24岁大二,他23岁大三。 ...
    点低阅读 394评论 0 1
  • 禅心不二参 图样图森破 一时,佛住金刚聚落跋求摩河侧萨罗梨林中 。 尔时,世尊为诸比丘说不净观,赞叹不净观言:...
    徐不二阅读 767评论 3 1