亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP SPL標準庫之接口(Interface)詳解

2024-05-04 23:35:00
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP SPL標準庫之接口(Interface)詳解,本文分別講解了Coutable接口、OuterIterator接口、RecursiveIterator接口、SeekableIterator接口、SplObserver和SplSubject接口等內容,需要的朋友可以參考下
 

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()函數時,Mycount::count()方法被調用
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 $observer); //剔除觀察者
    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代碼
*/

 

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品国产精品日韩精品| 2020欧美日韩在线视频| 久久国产精品久久久| 国产精品久久久久久久久久久久| 国内精品美女av在线播放| 国产精品久久999| 26uuu另类亚洲欧美日本一| 亚洲精品久久久久久下一站| 日韩高清不卡av| 欧美性生交xxxxxdddd| 精品视频久久久久久久| 国产激情久久久久| 欧美高跟鞋交xxxxxhd| 羞羞色国产精品| 神马国产精品影院av| 亚洲偷熟乱区亚洲香蕉av| 91黑丝在线观看| 国产视频精品在线| 九九久久国产精品| 亚洲性线免费观看视频成熟| 热99精品里视频精品| 久久99精品久久久久久琪琪| 国产精品一二三视频| 亚洲风情亚aⅴ在线发布| 亚洲欧美日韩直播| 久久久久久久久电影| 亚洲奶大毛多的老太婆| 欧美一级淫片丝袜脚交| 国产精品网站视频| 精品久久久精品| 欧美午夜精品久久久久久浪潮| 国产精品久久久久久久久久小说| 午夜精品久久久久久久99热| 欧美亚洲国产视频| 欧美成人在线免费视频| 国产综合久久久久| 日韩成人av在线| 欧美激情视频网| 国产精品高潮呻吟久久av野狼| 国产有码在线一区二区视频| 96pao国产成视频永久免费| 精品久久久久久亚洲国产300| 亚洲性视频网址| 日韩av毛片网| 欧美成人在线免费视频| 中文国产亚洲喷潮| 色哟哟网站入口亚洲精品| 成人福利在线观看| 欧美综合在线第二页| 国产精品视频免费在线| 国内精品小视频| 亚洲网站在线看| 国内精品国产三级国产在线专| 精品亚洲夜色av98在线观看| 亚洲最大福利网站| 91久久久久久| 久久深夜福利免费观看| 57pao精品| 8050国产精品久久久久久| 中文字幕在线视频日韩| 亚洲毛茸茸少妇高潮呻吟| 国产亚洲欧美视频| www.色综合| 成人精品一区二区三区| 午夜精品一区二区三区在线播放| 91精品国产色综合久久不卡98| 亚洲欧美精品伊人久久| 日韩大片在线观看视频| 欧美日韩免费观看中文| 国产精品青草久久久久福利99| 在线中文字幕日韩| 国产乱人伦真实精品视频| 亚洲最大的成人网| 色噜噜久久综合伊人一本| 色综合男人天堂| 亚洲女人天堂网| 亚洲免费影视第一页| 中文字幕日韩视频| 97精品国产97久久久久久春色| 国产精品黄色av| 8090理伦午夜在线电影| 日韩在线观看成人| 成人xxxx视频| 国产盗摄xxxx视频xxx69| 亚洲精品日韩av| 成人午夜黄色影院| 欧美日韩国产在线看| 综合136福利视频在线| 欧美成人免费一级人片100| 成人黄色免费在线观看| 亚洲精品二三区| 精品久久久久久久久中文字幕| 2019亚洲日韩新视频| 亚洲国产精品专区久久| 日韩av免费在线| 国产精品久久一| 国产免费一区视频观看免费| 黑人巨大精品欧美一区二区一视频| 亚洲精品在线不卡| 色www亚洲国产张柏芝| 国产va免费精品高清在线| 欧美最猛黑人xxxx黑人猛叫黄| 久久久久中文字幕2018| 国产午夜精品免费一区二区三区| 97久久精品在线| 性欧美暴力猛交69hd| 成人黄色午夜影院| 福利一区福利二区微拍刺激| 97色在线播放视频| 日韩高清电影免费观看完整| 亚洲精品www久久久| 一区二区欧美亚洲| 日韩精品极品毛片系列视频| 9.1国产丝袜在线观看| 日韩av中文字幕在线免费观看| 国产一区二区视频在线观看| 欧美日韩一区二区在线| 亚洲剧情一区二区| 亚洲国产私拍精品国模在线观看| 狠狠色狠色综合曰曰| 亚洲精品99久久久久中文字幕| 精品国产欧美一区二区三区成人| 亚洲欧美另类人妖| 色先锋资源久久综合5566| 日韩色av导航| 91精品国产乱码久久久久久蜜臀| 奇门遁甲1982国语版免费观看高清| 欧美日韩国产中字| 亚洲电影免费观看高清| 久久久久久久亚洲精品| 中文字幕av一区二区| 精品免费在线观看| 亚洲欧美激情在线视频| 黑人与娇小精品av专区| 亚洲福利在线看| 亚洲国产精品国自产拍av秋霞| 精品视频在线播放色网色视频| 久久久久久久电影一区| 欧美巨乳美女视频| 久久91精品国产| 欧美一级大胆视频| 亚洲精品久久久久| 欧美日韩国产色| 亚洲午夜小视频| 亚洲日韩欧美视频一区| 国产成人高潮免费观看精品| 777午夜精品福利在线观看| 中文字幕精品www乱入免费视频| 日韩中文在线观看| 亚洲精品网址在线观看| 亚洲电影免费观看高清完整版在线观看| 91久久久久久久| 国产成人极品视频| 亚洲成av人影院在线观看| 精品一区二区三区电影| 亚洲国产欧美一区二区三区久久| 国产精品啪视频| 色妞一区二区三区| 国产欧美一区二区三区视频| 亚洲欧美日韩一区二区三区在线| 久久久久久久久久国产| 久久久国产精品一区| 欧美日韩成人在线视频| 91精品国产自产在线老师啪|