PHP SPL标准库总共有6个接口

PHP SPL标准库总共有6个接口,如下:

1.Countable
2.OuterIterator
3.RecursiveIterator
4.SeekableIterator
5.SplObserver
6.SplSubject

其间OuterIterator、RecursiveIterator、SeekableIterator都以继续Iterator类的,上面会对每个接口成效和行使实行详尽表达。

Coutable接口:

兑现Countable接口的指标可用以count(卡塔尔函数计数。
复制代码 代码如下:
class Mycount implements Countable
{
    public function count()
    {
        static $count = 0;
        $count++;
        return $count;
    }
}
 
$count = new Mycount();
$count->count();
$count->count();
 
echo count($count); //3
echo count($count); //4

说明:

调用count(State of Qatar函数时,Mycount::count(State of Qatar方法被调用
count(卡塔尔国函数的第三个参数将不会产生震慑

OuterIterator接口:

自定义或改变迭代进度。
复制代码 代码如下:
//IteratorIterator是OuterIterator的多个兑现类
class MyOuterIterator extends  IteratorIterator {
 
    public function current()
    {
        return parent::current() . ‘TEST’;
    }
}
 
foreach(new MyOuterIterator(new ArrayIterator([‘b’,’a’,’c’])) as $key
=> $value) {
    echo “$key->$value”.PHP_EOL;
}
/*
结果:
0->bTEST
1->aTEST
2->cTEST
*/

在事实上行使中,OuterIterator非常有用:

复制代码 代码如下:
$db = new PDO(‘mysql:host=localhost;dbname=test’, ‘root’, ‘mckee’);
$db->query(‘set names utf8’);
$pdoStatement = $db->query(‘SELECT * FROM test1’,
PDO::FETCH_ASSOC);
$iterator = new IteratorIterator($pdoStatement);
$tenRecordArray = iterator_to_array($iterator);
print_r($tenRecordArray);

RecursiveIterator接口:
用来循环迭代多层组织的多少,RecursiveIterator其它提供了四个方法:

RecursiveIterator::getChildren 获取当前成分下子迭代器
RecursiveIterator::hasChildren 剖断当前因素下是不是有迭代器

复制代码 代码如下:
class MyRecursiveIterator implements RecursiveIterator
{
    private $_data;
    private $_position = 0;
 
    public function __construct(array $data) {
        $this->_data = $data;
    }
 
    public function valid() {
        return isset($this->_data[$this->_position]);
    }
 
    public function hasChildren() {
        return is_array($this->_data[$this->_position]);
    }
 
    public function next() {
        $this->_position++;
    }
 
    public function current() {
        return $this->_data[$this->_position];
    }
 
    public function getChildren() {
        print_r($this->_data[$this->_position]);
    }
 
    public function rewind() {
        $this->_position = 0;
    }
 
    public function key() {
        return $this->_position;
    }
}
 
$arr = array(0, 1=> array(10, 20), 2, 3 => array(1, 2));
$mri = new MyRecursiveIterator($arr);
 
foreach ($mri as $c => $v) {
    if ($mri->hasChildren()) {
        echo “$c has children: ” .PHP_EOL;
        $mri->getChildren();
    } else {
        echo “$v” .PHP_EOL;
    }
 
}
/*
结果:
0
1 has children:
Array
(
    [0] => 10
    [1] => 20
)
2
3 has children:
Array
(
    [0] => 1
    [1] => 2
)
*/

SeekableIterator接口:

经过seek(卡塔尔方法完成可墨守陈规的迭代器,用于寻找有个别地点下的要素。
复制代码 代码如下:
class  MySeekableIterator  implements  SeekableIterator  {
 
    private  $position = 0;
 
    private  $array  = array(
        “first element” ,
        “second element” ,
        “third element” ,
        “fourth element”
    );
 
    public function  seek ( $position ) {
        if (!isset( $this -> array [ $position ])) {
            throw new  OutOfBoundsException ( “invalid seek position (
$position )” );
        }
 
       $this -> position  =  $position ;
    }
 
    public function  rewind () {
        $this -> position  =  0 ;
    }
 
    public function  current () {
        return  $this -> array [ $this -> position ];
    }
 
    public function  key () {
        return  $this -> position ;
    }
 
    public function  next () {
        ++ $this -> position ;
    }
 
    public function  valid () {
        return isset( $this -> array [ $this -> position ]);
    }
}
 
try {
 
    $it  = new  MySeekableIterator ;
    echo  $it -> current (),  “n” ;
 
    $it -> seek ( 2 );
    echo  $it -> current (),  “n” ;
 
    $it -> seek ( 1 );
    echo  $it -> current (),  “n” ;
 
    $it -> seek ( 10 );
 
} catch ( OutOfBoundsException $e ) {
    echo  $e -> getMessage ();
}
/*
结果:
first element
third element
second element
invalid seek position ( 10 )
*/

SplObserver和SplSubject接口:
SplObserver和SplSubject接口用来落实观看者设计情势,观看者设计情势是指当三个类的状态产生变化时,注重它的靶子都会收取文告并立异。使用情状十二分广泛,举个例子说当三个平地风波发生后,必要创新七个逻辑操作,守旧方法是在事件增加后编写逻辑,这种代码耦归总难以保证,观望者情势可达成低耦合的公告和换代机制。
看看SplObserver和SplSubject的接口布局:
复制代码 代码如下:
//SplSubject布局 被观望的靶子
interface SplSubject{
    public function attach(SplObserver $observer卡塔尔; //加多观看者
    public function detach(SplObserver $observerState of Qatar; //剔除观看者
    public function notify(卡塔尔; //通告观看者
}
 
//SplObserver构造 代表观看者
interface SplObserver{
    public function update(SplSubject $subject卡塔尔; //更新操作
}

看上边一个贯彻观看者的例证:

复制代码 代码如下:
class Subject implements SplSubject
{
    private $observers = array();
 
    public function attach(SplObserver  $observer)
    {
        $this->observers[] = $observer;
    }
 
    public function detach(SplObserver  $observer)
    {
        if($index = array_search($observer, $this->observers, true))
{
            unset($this->observers[$index]);
        }
    }
 
    public function notify()
    {
        foreach($this->observers as $observer) {
            $observer->update($this);
        }
    }
 
 
}
 
class Observer1 implements  SplObserver
{
    public function update(SplSubject  $subject)
    {
        echo “逻辑1代码”.PHP_EOL;
    }
}
 
class Observer2 implements  SplObserver
{
    public function update(SplSubject  $subject)
    {
        echo “逻辑2代码”.PHP_EOL;
    }
}
 
 
$subject = new Subject();
$subject->attach(new Observer1());
$subject->attach(new Observer2());
 
$subject->notify();
/*
结果:
逻辑1代码
逻辑2代码
*/

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website