ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

phpのSplObjectStorage

こんにちは、エンジニアインターンの國丸です。今日はphpのStandard PHP Libraryのデータ構造に関するクラスの一つ、SplObjectStorageを紹介します。

SPL Datastructures

  • SplDoublyLinkedList:連結リスト
  • SplStack:スタック
  • SplQueue:キュー
  • SplHeap:ヒープ
  • SplMaxHeap:降順のヒープ
  • SplMinHeap:昇順のヒープ
  • SplPriorityQueue:優先度を保持するキュー
  • SplFixedArray:固定長の「配列」
  • SplObjectStorage オブジェクトのストレージ

SplObjectStorage

SplObjectStorage クラスは、オブジェクトをデータに対応させたり、 データを渡さずオブジェクトセットとして使用したりします。 これらはどちらも、オブジェクトを一意に特定したい場合に便利です。

このクラスはオブジェクトのストレージです。オブジェクトのハッシュとオブジェクトへのリファレンスが共に管理されます。ストレージには同一オブジェクトを登録できないため、オブジェクトがユニークであることが保証されます。

サンプル

<?php

$new = new SplObjectStorage();

/* リファレンスは同一と見なされるか */
$s = clone($new);
$o1 = new stdClass;
$o2 = $o1;

$s->attach($o1);
$s->attach($o2);

var_dump($s);

/* 内部状態の変更されたものは同一と見なされるか */
$s = clone($new);
$s->attach($o1);

$o1->value = 'you are my star.';
$s->attach($o1);

var_dump($s);

/* ストレージ内部のオブジェクトはリファンレンスか */
$s = clone($new);
$s->attach($o1);

$o1->value = 'your meister.';

var_dump($s);

出力結果

object(SplObjectStorage)#2 (1) {
  ["storage":"SplObjectStorage":private]=>
  array(1) {
    ["000000002d20940100000000212dce59"]=>
    array(2) {
      ["obj"]=>
      object(stdClass)#3 (0) {
      }
      ["inf"]=>
      NULL
    }
  }
}
object(SplObjectStorage)#4 (1) {
  ["storage":"SplObjectStorage":private]=>
  array(1) {
    ["000000002d20940100000000212dce59"]=>
    array(2) {
      ["obj"]=>
      object(stdClass)#3 (1) {
        ["value"]=>
        string(16) "you are my star."
      }
      ["inf"]=>
      NULL
    }
  }
}
object(SplObjectStorage)#2 (1) {
  ["storage":"SplObjectStorage":private]=>
  array(1) {
    ["000000002d20940100000000212dce59"]=>
    array(2) {
      ["obj"]=>
      object(stdClass)#3 (1) {
        ["value"]=>
        string(13) "your meister."
      }
      ["inf"]=>
      NULL
    }
  }
}