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
|
//適当なクラスを作成
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
トラックバック
トラックバックURL: