SplObjectStorage を使用して一連の固有のものを追跡することを提案した人がいます。文字列では機能しないことを除けば、素晴らしいです。「SplObjectStorage::attach() は、パラメーター 1 がオブジェクトであると想定しています。59 行目の fback.php で指定された文字列です」というエラーが表示されます。
何か案は?
オブジェクトを格納するためのSplObjectStorage
ストレージ クラスです。他のいくつかのプログラミング言語とは対照的にstrings
、PHP ではオブジェクトではなく、文字列です ;-)。したがって、SplObjectStorage
文字列をクラスのオブジェクトでラップしたとしても、文字列を -に格納しても意味がありませんstdClass
。
一意の文字列のコレクションを格納する最良の方法は、文字列をキーおよび値として配列 (ハッシュテーブルとして) を使用することです ( Ian Selbyの提案による)。
$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...
ただし、この機能をカスタム クラスにラップすることもできます。
class UniqueStringStorage // perhaps implement Iterator
{
protected $_strings = array();
public function add($string)
{
if (!array_key_exists($string, $this->_strings)) {
$this->_strings[$string] = $string;
} else {
//.. handle error condition "adding same string twice", e.g. throw exception
}
return $this;
}
public function toArray()
{
return $this->_strings;
}
// ...
}
ところで、SplObjectStorage
PHP < 5.3.0 の動作をシミュレートして、その動作をよりよく理解することができました。
$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
$id1 => $ob1,
$id2 => $ob2
);
SplObjectStorage
spl_object_hash()
オブジェクト インスタンスを識別できるように、各インスタンス ( など) の一意のハッシュを格納します。上で述べたように、文字列はまったくオブジェクトではないため、インスタンス ハッシュはありません。文字列の一意性は、文字列値を比較することで確認できます。2 つの文字列は、同じバイト セットを含む場合に同等です。
オブジェクトストレージです。文字列はスカラーです。したがって、SplStringを使用します。
文字列をstdClassでラップしますか?
$dummy_object = new stdClass();
$dummy_object->string = $whatever_string_needs_to_be_tracked;
$splobjectstorage->attach($dummy_object);
ただし、この方法で作成されたすべてのオブジェクトは、文字列が同一であっても一意です。
文字列の重複を心配する必要がある場合は、代わりにハッシュ(連想配列)を使用して文字列を追跡する必要がありますか?
$myStrings = array();
$myStrings[] = 'string1';
$myStrings[] = 'string2';
...
foreach ($myStrings as $string)
{
// do stuff with your string here...
}
配列内の文字列の一意性を確保したい場合は、いくつかのことを行うことができます...最初は単純に array_unique() を使用することです。または、値だけでなく文字列をキーとして連想配列を作成することもできます。
$myStrings = array();
$myStrings['string1'] = 'string1';
...
これについてオブジェクト指向になりたい場合は、次のようにすることができます。
class StringStore
{
public static $strings = array();
// helper functions, etc. You could also make the above protected static and write public functions that add things to the array or whatever
}
次に、コードで次のようなことができます。
StringStore::$strings[] = 'string1';
...
そして同じように繰り返します:
foreach (StringStore::$strings as $string)
{
// whatever
}
SplObjectStorage は、オブジェクトの一意のインスタンスを追跡するためのものであり、文字列を操作しないこと以外に、達成しようとしていることには少しやり過ぎです (私の意見では)。
それが役立つことを願っています!