忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/07/23 19:53 |
PHP1-38:オブジェクトでイテレータ

new SplDoublyLinkedList();
Fatal error: Class 'SplDoublyLinkedList' not found

お?

spl_classes()で自分の環境に入っているSPL関連クラスを調べることが出来ます。

試してみたところ、何故かデータ構造関連のクラスが一切入っていませんでした。
何処にも書かれていませんが、どうやら現時点では開発中のPHP5.3以降でないと使用できないようです。

それ以外は入っていたのですが、SplDoublyLinkedListのかわりなのかなんなのかSplObjectStorageとかいうのが入っている。
見慣れないというかマニュアルに載っていません。

どうやらPHP6で実装されるクラスのようですが、何故か5.2.5の時点で既に存在しています。
とりあえず触ってみます。

splobjectstorage.php 

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
<?php
    
    //適当なクラスを作成
        class testClass1{}
        class testClass2{}
        
        $a=new testClass1(0);
        $b=new testClass1(5);
        $c=new testClass2('x');
    
    //SplObjectStorageに代入
        $st=new SplObjectStorage();
        
        $st->attach($a);
        $st->attach($b);
        $st->attach($c);
    
    //SplObjectStorageの挙動
        $st->count();//オブジェクト数=3
        
        $st->contains($b);    //$bが含まれているのでtrue
        $st->contains(new testClass1(5));    //$bと違うインスタンスなのでfalse
        
        $st->current();        //null
        
        $st->rewind();        //$stのポインタ初期化
        $st->key();            //$aの順番=0
        $st->current();        //$a
    
        $st->next();
        $st->key();            //$bの順番=1
        $st->current();        //$b
        
        $st->next();
        $st->valid();        //3番目に$cが存在するのでtrue
        $st->next();
        $st->valid();        //4番目は存在しないのでfalse
        
        $st->detach($b);    //$bを削除
        $st->count();        //オブジェクト数=2

前回行った配列に関するイテレータと同じように、SplObjectStorageはオブジェクトに対してイテレータを適用するためのクラスのようです。
newの部分以外は、配列に関するイテレータとまったく同じように扱うことが出来ます。
素晴らしいですね。

最大の問題点は、使い道がよくわからないというところでしょうか。


ソースはこちらに載っているようですが、
http://www.php.net/~helly/php/ext/spl/splobjectstorage_8inc-source.html
これってPHPで実装されてるのか?

privateなインスタンス変数にアクセスした際、普通はCannot access private propertyエラーになるのだが、
$st->indexはUndefined propertyになるので、少なくともそのままの実装ではないような気がする。
 

 

PR


2008/12/10 12:53 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-39:ディレクトリでイテレータ | HOME | PHP1-37:PHPでイテレータ>>
忍者ブログ[PR]