34

一意のオブジェクトのコレクションを管理するコードに取り組んでいます。このコードの最初のプロトタイプは連想配列を利用しています。

しかし、PHP のより新しいバージョンに追加された機能を利用することにも熱心です。たとえば、[SplObjectStorage][1]代わりにこれを行うことです。これは、一部は学習経験として、一部は利点をもたらすはずだからです (私が見たベンチマークは、それSplObjectStorageができることを示唆しています)多くの場合、配列よりも高速です)。

現在の実装には連想配列がありin_array()、新しいオブジェクトを追加する前に、オブジェクトが配列に既に存在するかどうかを確認します。

私が見ることができる大きな問題SplObjectStorageは、(一見すると) キー/値の連想配列の動作をサポートしていないように見え、インデックス付き配列としてしか扱えないことです。ただし、PHP の新しい機能に関するドキュメントは、言語のより確立された部分のドキュメントの標準に達していないため、単に何かが欠けている可能性があります。

SplObjectStorage連想配列の代わりに使用できますか? その場合、新しいオブジェクトを追加するときにキーを定義するにはどうすればよいですか? SplObjectStorageさらに重要なことは、連想配列と比較した場合の相対的な長所と短所は何ですか?

4

3 に答える 3

29

SplObjectStorageをキーと値のストアとしてではなく、単なるオブジェクトのセットと見なすべきです。何かがセットにあるかどうかは関係ありませんが、その位置は重要ではありません

の要素の「キー」SplObjectStorageは、実際にはオブジェクトのハッシュです。同じオブジェクト インスタンスの複数のコピーを に追加することはできないSplObjectStorageため、追加する前にコピーが既に存在するかどうかを確認する必要はありません。

ただし、オブジェクトの「ハッシュ」を返すオーバーライド可能PHP 5.4な新しいメソッドが呼び出さgetHash()れます。これは、ある意味では、キーを返したり設定したりして、さまざまな条件下でキーを保存できるようにします。

の主な利点は、さまざまなセット ( などSplObjectStorage)を処理および操作するための多くのメソッドを取得できるという事実です。速度はわずかに向上しますが、メモリ使用量は通常の PHP 配列よりも悪くなります。contains()removeAll()removeAllExcept()

于 2012-01-30T19:32:24.243 に答える
1

配列に割り当てられたすべてのメモリが使い果たされると、配列に割り当てられたメモリは 2 倍になります。このコンテキストでは、オブジェクトのコレクションがより効果的な構造になる場合があります。

于 2015-04-21T17:28:39.177 に答える