SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。
一.spl_autoload_register
更加方便的惰性加载
二.Iterator:迭代器
迭代器是比较重要的一种设计模式.普遍用于数组遍历.php的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 Users implements Iterator
{
protected $position = 0;
protected $storage = array();
public function __construct()
{
$this->getWithData();
}
public function getWithData()
{
$this->storage[] = array(
array('id' => 1, 'name' => 'john'),
array('id' => 2, 'name' => 'jake')
);
}
public function current()
{
return $this->storage[$this->position];
}
public function next()
{
$this->position ++;
}
public function key()
{
return $this->position;
}
public function valid()
{
return isset($this->storage[$this->position]);
}
public function rewind()
{
$this->position = 0;
}
}
$users = new Users();
foreach ($users as $key => $value) {
echo $key;
var_dump($value);
}
$users->rewind();
// 或者
while ($users->valid()) {
$cur = $users->current();
$users->next();
var_dump($cur);
}
SPL内置的迭代器类,可以方便的实现一些功能,比如迭代一个文件夹:
RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIterator
RecursiveCachingIterator
NoRewindIterator
AppendIterator
RecursiveIteratorIterator
InfiniteIterator
RegexIterator
RecursiveRegexIterator
EmptyIterator
RecursiveTreeIterator
ArrayIterator
ps:
注意区分ArrayIterator和ArrayAccess的区别;
ArrayAccess:提供像访问数组一样访问对象的能力的接口
三.ArrayAccess接口:
ArrayAccess {
/* 方法 */
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
}
示例代码(结合单例模式):
class Config implements ArrayAccess
{
private static $instance = null;
private $configs;
private function __construct()
{
$this->configs = array(
'db_type' => 'mysql',
'db_user' => 'root'
);
}
public static function getInstance()
{
if (is_null(self::$instance)) {
self::$instance = new Config();
}
return self::$instance;
}
public function offsetExists($offset)
{
return isset($this->configs[$offset]);
}
public function offsetGet($offset)
{
return $this->configs[$offset];
}
public function offsetSet($offset, $value)
{
$this->configs[$offset] = $value;
}
public function offsetUnset($offset)
{
unset($this->configs[$offset]);
}
public function __toString()
{
return (string)var_export($this->configs, true);
}
private function __clone()
{
}
}
$config = Config::getInstance();
print $config['db_type'];
print "\n";
$config['db_pwd'] = '1123';
print $config;
四.SplFixedArray
SplFixedArray 实例化一个固定长度的数组.SplFixedArray数组相比标准的PHP数组更接近于C语言的数组,而且由于splFixedArray没有使用散列(Hash)存储方式,因此效率更高.