中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP SPL標準庫接口有哪些

發布時間:2021-09-29 11:11:11 來源:億速云 閱讀:148 作者:iii 欄目:開發技術

這篇文章主要介紹“PHP SPL標準庫接口有哪些”,在日常操作中,相信很多人在PHP SPL標準庫接口有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP SPL標準庫接口有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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代碼
*/

到此,關于“PHP SPL標準庫接口有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

通化县| 大冶市| 健康| 宜都市| 丹巴县| 文昌市| 万源市| 茂名市| 建平县| 嘉峪关市| 麻江县| 曲阜市| 昌邑市| 山东| 鹤峰县| 通海县| 枞阳县| 麻江县| 北辰区| 修水县| 襄城县| 汨罗市| 唐河县| 新邵县| 卢氏县| 南昌市| 淄博市| 蕲春县| 许昌市| 长兴县| 巴林左旗| 正镶白旗| 金平| 宣汉县| 西峡县| 尉氏县| 安福县| 五台县| 谢通门县| 临澧县| 沙雅县|