PHPのSPLにはSplObjectStorageってのがあるんだね

久々にSPLのドキュメントを見てみた。

This container allows to store objects uniquly without the need to compare them one by one. This is only possible internally. The code represenation here therefore has a complexity of O(n) while the actual implementation has complexity O(1).
SPL-StandardPHPLibrary: SplObjectStorage Class Reference

SplObjectStorageは前からあるんだっけ?"Since PHP6.0"って書いてあるけど、5.1.6でも使えた。オブジェクトをユニークに保持して、イテレータとして使える、と。

$storage = new SplObjectStorage();
$a = new Hoge("a");
$b = new Hoge("b");
$c = new Hoge("c");
echo "check attach:\n";
var_dump($storage->attach($a));
var_dump($storage->attach($a));
var_dump($storage->attach($b));
echo "check count:\n";
echo $storage->count() . "\n";
echo "check contains:\n";
var_dump($storage->contains($a));
var_dump($storage->contains($b));
var_dump($storage->contains($c));
echo "check iteration:\n";
$storage->rewind();
while($storage->valid()) {
  echo $storage->current()->id;
  $storage->next();
}
echo "\n";
echo "check detach:\n";
var_dump($storage->detach($a));
var_dump($storage->detach($b));
var_dump($storage->detach($c));
class Hoge{
  public $id;
  public function __construct($id) {
    $this->id = $id;
  }
}
/** output
check attach:
NULL
NULL
NULL
check count:
2
check contains:
bool(true)
bool(true)
bool(false)
check iteration:
ab
check detach:
NULL
NULL
NULL
**/

ドキュメントのdescriptionは、『O(1)で実現すべきだけど、今のところO(n)ですよ』って事かな?ZFにもオブジェクトのユニークな管理機構があったと思うけど、あれはSplObjectStorageを使ってなかった気がする。

これも使いどころが分からず。

プロフィール

このブログ記事について

このページは、koshigoeが2006年12月 3日 00:14に書いたブログ記事です。

ひとつ前のブログ記事は「PHP5.1.0から"not well-formed XML"を扱えるんだっけ?」です。

次のブログ記事は「ついでにSplFileObjectも触ってみた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。