PHP SPL標準ライブラリのインターフェースを詳しく解説_PHPチュートリアル

WBOY
リリース: 2016-07-13 09:54:13
オリジナル
919 人が閲覧しました

PHP SPL標準ライブラリのインターフェース(Interface)の詳細説明

この記事では、PHP SPL標準ライブラリのインターフェース(Interface)の詳細説明を中心に紹介します この記事では、Coutableインターフェース、OuterIteratorインターフェース、RecursiveIteratorについて解説します。インターフェイス、SeekableIterator インターフェイス、SplObserver および SplSubject インターフェイス、その他のコンテンツは、必要な友人が参照できます

PHP SPL標準ライブラリには、以下の合計6つのインターフェースがあります。

1.可算

2.OuterIterator

3.RecursiveIterator

4.SeekableIterator

5.SplObserver

6.SplSubject

このうち、OuterIterator、RecursiveIterator、SeekableIteratorはいずれもIteratorクラスを継承しています。各インターフェースの機能と使い方については、以下で詳しく説明します。

Coutableインターフェース:

Countableインターフェースを実装したオブジェクトは、count()関数によるカウントに使用できます。

コードは次のとおりです:

クラス Mycount は Countable を実装します

{

パブリック関数 count()

{

静的 $count = 0;

$count++;

$count を返す;

}

}

$count = new Mycount();

$count->count();

$count->count();

エコーカウント($count); //3

エコーカウント($count); //4

説明:

count() 関数を呼び出すと、Mycount::count() メソッドが呼び出されます

count()関数の2番目のパラメータは効果がありません

OuterIteratorインターフェース:

反復プロセスをカスタマイズまたは変更します。

コードは以下の通りです:

//IteratorIteratorはOuterIteratorの実装クラスです

class MyOuterIterator extends IteratorIterator {

パブリック関数 current()

{

returnparent::current() 'TEST';

}

}

foreach(new MyOuterIterator(new ArrayIterator(['b','a','c'])) as $key => $value) {

echo "$key->$value".PHP_EOL;

}

/*

結果:

0->bTEST

1->テスト

2->cTEST

*/

実際のアプリケーションでは、OuterIterator は非常に便利です。

コードは以下の通りです:

$db = 新しい 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 には、次の 2 つの追加メソッドが用意されています。

RecursiveIterator::getChildren 現在の要素の子イテレータを取得します

RecursiveIterator::hasChildrenは、現在の要素の下に反復子があるかどうかを判断します

コードは次のとおりです:

クラス MyRecursiveIterator は RecursiveIterator を実装します

{

プライベート $_data;

プライベート $_position = 0;

パブリック関数 __construct(array $data) {

$this->_data = $data;

}

パブリック関数 valid() {

return isset($this->_data[$this->_position]);

}

パブリック関数 hasChildren() {

return is_array($this->_data[$this->_position]);

}

パブリック関数 next() {

$this->_position++;

}

パブリック関数 current() {

return $this->_data[$this->_position];

}

パブリック関数 getChildren() {

print_r($this->_data[$this->_position]);

}

パブリック関数 rewind() {

$this->_position = 0;

}

公開関数キー() {

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 には子があります: " .PHP_EOL;

$mri->getChildren();

} 他 {

エコー "$v" .PHP_EOL;

}

}

/*

結果:

0

1人には子供がいます:

配列

(

[0] => 10

[1] => 20

2

3人には子供がいます:

配列

(

[0] => 1

[1] => 2

*/

SeekableIteratorインターフェース:

特定の位置にある要素を検索するために使用される、seek() メソッドを通じて検索可能なイテレータを実装します。

コードは以下の通りです:

クラス MySeekableIterator は SeekableIterator を実装します {

private $position = 0;

private $array = array(

「最初の要素」、

「第二要素」、

「第三要素」、

「第四の要素」

);

public function seen ( $position ) {

if (!isset( $this -> array [ $position ])) {

throw new OutOfBoundsException ( "無効なシーク位置 ( $position )" );

}

$this ->位置 = $位置 ;

}

public function rewind() {

$this ->位置 = 0 ;

}

public function current () {

$this を返す ->配列 [ $this ->位置];

}

公開ファンクションキー() {

$this を返す ->位置 ;

}

public function next () {

++ $this ->位置 ;

}

パブリック関数有効() {

return isset( $this ->gt; array [ $this ->position ]);

}

}

試してみましょう

$it = 新しい MySeekableIterator ;

echo $it ->現在の ()、「n」 ;

$it ->シーク ( 2 );

echo $it ->現在の ()、「n」 ;

$it ->シーク ( 1 );

echo $it ->現在の ()、「n」 ;

$it ->シーク ( 10 );

} catch ( OutOfBoundsException $e ) {

echo $e -> getMessage();

}

/*

結果:

最初の要素

第三要素

2番目の要素

無効なシーク位置 ( 10 )

*/

SplObserver と SplSubject インターフェース:

SplObserver と SplSubject インターフェイスは、ビューワ設定モードを実現するために使用されます。ビューワ設定モードとは、ある種類の状態が変化したときに、そのオブジェクトが通知を受けて更新されることを意味します。イベント発生その後、複数の更新操作が必要になります。転送方式では、イベントの追加後にこのコードが結合され、保存され、ビューアモードで低結合の通知および更新機構が実現されます。

SplObserver と SplSubject のインターフェース構造:

代幣如下:

//SplSubject结构被観察オブジェクト

インターフェース SplSubject{

public functionattach(SplObserver $observer); //観察者追加

public function detach(SplObserver $observer); //剔除观観察者

パブリック関数notify(); // 通知観察者

}

//SplObserver结构代表観察者

インターフェースSplObserver{

public function update(SplSubject $subject); //操作を更新します

}

次の観察者の例:

复制代码代码如下:

クラス Subject は SplSubject を実装します

{

private $observers = array();

パブリック関数attach(SplObserver $observer)

{

$this->observers[] = $observer;

}

public function detach(SplObserver $observer)

{

if($index = array_search($observer, $this->observers, true)) {

unset($this->observers[$index]);

}

}

パブリック関数notify()

{

foreach($this->observers as $observer) {

$observer->update($this);

}

}

}

クラスObserver1はSplObserverを実装します

{

public function update(SplSubject $subject)

{

echo "逻辑1代码".PHP_EOL;

}

}

クラスObserver2は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代

*/

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/998359.html技術記事 PHP SPL標準ライブラリのインターフェース(Interface)の詳細説明 この記事では、PHP SPL標準ライブラリのインターフェース(Interface)の詳細説明を中心に紹介しています この記事では、Coutableインターフェース、OuterIteratorインターフェース、Recursi...
について解説します。
関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート