私は、一意のオブジェクトのコレクションを管理するためのコードに取り組んでいます。このコードの最初のプロトタイプは、基本的に私がいつもやってきた方法であるため、連想配列を利用しています。
ただし、SplObjectStorageなどの最新バージョンのPHP)に追加された機能を利用して、代わりにこれを行うことにも熱心です。これは、一部は学習体験として、一部は提供する必要があるためです。利点(私が見たベンチマークは、多くの場合、SplObjectStorageが配列よりも高速である可能性があることを示唆しています)。
現在の実装には連想配列があり、新しいオブジェクトを追加する前に、in_arrayでオブジェクトがすでに配列にあるかどうかを確認します。
SplObjectStorageで私が見ることができる大きな問題は、(一見)キー/値連想配列の動作をサポートしていないように見え、インデックス付き配列としてのみ扱うことができるということです。ただし、PHPの新しい機能のドキュメントは、言語のより確立された部分のドキュメントの標準に達しておらず、単に何かが足りない可能性があります。
連想配列の代わりにSplObjectStorageを使用できますか?その場合、新しいオブジェクトを追加するときにキーを定義するにはどうすればよいですか?さらに重要なことに、連想配列と比較した場合のSplObjectStorageの相対的な長所と短所は何ですか?
SplObjectStorage
をキー値ストアとして表示するのではなく、単にオブジェクトのセットとして表示する必要があります。セットに何かが含まれているかどうかはわかりませんが、その位置は重要ではありません。
SplObjectStorage
内の要素の「キー」は、実際にはオブジェクトのハッシュです。同じオブジェクトインスタンスの複数のコピーをSplObjectStorage
に追加することはできないため、追加する前にコピーがすでに存在するかどうかを確認する必要はありません。
ただし、_PHP 5.4
_には、オブジェクトの「ハッシュ」を返すgetHash()
という新しいメソッドをオーバーライドできます。これは、ある意味で、キーを返す/設定するので、さまざまな条件下でキーを保存できます。
SplObjectStorage
の主な利点は、さまざまなセットを処理および操作するための多くのメソッドを取得できることです(contains()
、removeAll()
、removeAllExcept()
etc)。その速度はわずかに優れていますが、メモリ使用量が悪い通常のPHP配列よりも悪いです。
実行後の結果 benchmarkPHP 5.6.13
で10000回の反復:
+------------------+----------------+----------------+---------+
| Type | Time to fill | Time to check | Memory |
+------------------+----------------+----------------+---------+
| SplObjectStorage | 0.021285057068 | 0.019490000000 | 2131984 |
| Array | 0.021125078201 | 0.020912000000 | 1411440 |
+------------------+----------------+----------------+---------+
ご覧のとおり、Array
はSplObjectStorage
よりもそれほど速くはありませんが、34%少ないメモリ。
アレイに割り当てられたすべてのメモリが使い果たされると、アレイに割り当てられたメモリは2倍になります。このコンテキストでは、オブジェクトのコレクションがより効果的な構造になる場合があります。