一 预定义接口
1.1 遍历
Traversable(遍历)接口
检测一个类是否可以被foreach遍历,该接口不能被单独的实现,只能由Iterator或IteratorAggregate实现。这是一个无法在 PHP 脚本中实现的内部引擎接口。IteratorAggregate或Iterator接口可以用来代替它。
接口摘要:
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 已为我们实现了常见的迭代器:
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 具体对象