この記事では、PHPの6つの定義済みインターフェースの紹介を中心に、Traversable、Iterator、IteratorAggregate、ArrayAccess、Serializable、Closureについて説明します。ダウン
PHP には、以下に紹介する 6 つのインターフェースが事前定義されています。
1.トラバース可能なトラバーサルインターフェース
実際、これは PHP で使用できるインターフェースではありません。その目的の 1 つは、クラスを横断できるかどうかを検出することです。
?
1 2 3 |
if(Traversable の $class インスタンス) { //foreach } |
2.イテレーターインターフェース
インターフェースの概要:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Iterator は Traversable を拡張します { //現在のインデックスカーソルが指す要素を返します 抽象的な公共混合流(void) //現在のインデックスカーソルが指す要素のキー名を返します 抽象公開スカラーキー(無効) //現在のインデックス カーソルを次の要素を指すように移動します 抽象パブリック void next(void) //最初の要素を指すようにインデックス カーソルをリセットします 抽象パブリック void rewind(void) //現在のインデックス カーソルが要素を指しているかどうかを判断します。これは、rewind() または next() を呼び出すときによく使用されます 抽象パブリックブール値有効(void) } |
上記により、クラスで基本的な反復関数を実装できるようになります。次のように反復呼び出しシーケンスを確認できます。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
クラス myIterator は Iterator { を実装します プライベート $位置 = 0 ;プライベート $array = array( 「最初の要素」、 「第 2 要素」、 「ラストエレメント」、 );
パブリック関数 __construct () { $this -> 位置 = 0 ; }
関数巻き戻し() { var_dump ( __METHOD__ ); $this -> 位置 = 0 ; }
関数現在の() { var_dump ( __METHOD__ ); $this -> 配列 [ $this -> 位置 ]; ; }
ファンクションキー(){ var_dump ( __METHOD__ ); $this を返す -> 位置 ; }
次の関数 () { var_dump ( __METHOD__ ); ++ $this -> }
関数が有効です () { var_dump ( __METHOD__ ); return isset( $this -> 配列 [ $this -> 位置 ]); } }
$it = 新しい myIterator ;
foreach( $it as $key => $value ) { var_dump ( $key , $value ); エコー「ン」 ; }
|
インターフェースの概要:
?
2 3 4 5
|
IteratorAggregate は Traversable を拡張します {
//外部イテレータを取得する abstract public Traversable getIterator (void) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
クラス myData は IteratorAggregate を実装します { public $property1 = "公共プロパティ 1" ; public $property2 = "公共プロパティ 2" ; public $property3 = "公共プロパティ 3" ;
パブリック関数 __construct () { $this -> property4 = "最後のプロパティ" ; }
パブリック関数 getIterator () { 新しい ArrayIterator ( $this ) を返します; } }
$obj = 新しい myData ;
foreach( $obj as $key => $value ) { var_dump ( $key , $value ); エコー「ン」 ; } |
4.ArrayAccess 配列アクセスインターフェース
インターフェースの概要:
?
1 2 3 4 5 6 7 |
配列アクセス { /* メソッド */ abstract public boolean offsetExists (mixed $offset) //オフセット位置が存在するかチェック abstract publicmixedoffsetGet(mixed$offset) //オフセット位置の値を取得します abstract public void offsetSet (mixed $offset ,mixed $value ) //オフセット位置の値を設定します abstract public void offsetUnset (mixed $offset) //オフセット位置の値をリセットします } |
オブジェクトは次のように配列のようにアクセスできます。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
クラスobjはarrayaccessを実装します{ プライベート $container = array(); パブリック関数 __construct () { $this -> コンテナ = 配列( ; 「1」 => 1 、「2」 => 2 、 「3」 => 3 、 ); } パブリック関数 offsetSet ( $offset , $value ) { if ( is_null ( $offset )) { $this -> コンテナ [] = $value ; } 他 { $this -> コンテナ [ $offset ] = $value ; } } パブリック関数 offsetExists ( $offset ) { return isset( $this ->container [ $offset ]); } パブリック関数 offsetUnset ( $offset ) { unset( $this -> コンテナ [ $offset ]); } パブリック関数 offsetGet ( $offset ) { return isset( $this -> コンテナ [ $offset ]) ? $this -> コンテナ [ $offset ] : null ; } }
$obj = 新しいオブジェクト ;
var_dump (isset( $obj [ "two" ])); var_dump ( $obj [ "two" ]); unset( $obj [ "two" ]); var_dump (isset( $obj [ "two" ])); $obj [ "two" ] = "値" ; var_dump ( $obj [ "two" ]); $obj [] = '追加 1' ; $obj [] = '追加 2' ; $obj [] = '追加 3' ; print_r ( $obj );
|
インターフェースの概要:
?
1 2 3 4 5 6
|
シリアル化可能{
/* メソッド */ abstract public stringserialize (void) //オブジェクトの文字列表現 abstract public mixed unserialize ( string $serialized ) // オブジェクトを構築します }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
クラスobjはSerializable { を実装しますプライベート $データ ; パブリック関数 __construct () { $this -> data = "私の個人データ" ; } パブリック関数serialize() { シリアル化を返す ( $this -> データ ); } パブリック関数 unserialize ( $data ) { $this -> データ = アンシリアル化 ( $data ); } パブリック関数 getData() { $this -> データを返す ; ;} }
$obj = 新しいオブジェクト ; $ser = シリアル化 ( $obj ); print_r($ser); $newobj = アンシリアライズ ( $ser ); print_r($newobj); |
6.締めくくり
インターフェースの概要:
?
1 2 3 4 5 6 |
クロージング{ /* メソッド */ __construct (void) //インスタンス化を禁止するために使用されるコンストラクター public static Closure binding ( Closure $closure , object $newthis [,mixed $newscope = 'static' ] ) //クロージャーをコピーし、指定された $this オブジェクトとクラス スコープをバインドします。 public Closure bindingTo ( object $newthis [,mixed $newscope = 'static' ] ) //現在のクロージャ オブジェクトをコピーし、指定された $this オブジェクトとクラス スコープをバインドします。 } |
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
クラスA { プライベート静的 $sfoo = 1 ; プライベート $ifoo = 2; } $cl1 = 静的関数() { A を返す :: $sfoo ; }; $cl2 = function() { $this を返します -> ifoo ; ;};
$bcl1 = クロージャ :: バインド ( $cl1 , null , 'A' ); $bcl2 = クロージャ :: バインド ( $cl2 , new A (), 'A' ); エコー $bcl1 (), "n" ; エコー $bcl2 (), "n" ; |