SplObjectStorage は String では機能しません。どうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1501726

  •  19-09-2019
  •  | 
  •  

質問

誰かが、SplObjectStorage を使用して一連の固有のものを追跡することを提案しました。素晴らしいですが、文字列では機能しません。「SplObjectStorage::attach() はパラメータ 1 がオブジェクトであることを期待しています。fback.php の 59 行目で指定された文字列です」というエラーが表示されます。

何か案は?

役に立ちましたか?

解決

SplObjectStorage その名前は次のとおりです。オブジェクトを格納するためのストレージ クラス。他のプログラミング言語とは対照的に strings は PHP のオブジェクトではなく、文字列です ;-)。したがって、文字列を SplObjectStorage - 文字列をクラスのオブジェクトでラップした場合でも stdClass.

一意の文字列のコレクションを保存する最良の方法は、文字列をキーおよび値として含む配列 (ハッシュテーブルとして) を使用することです (提案されているように) イアン・セルビー).

$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は、オブジェクトのユニークなインスタンスを追跡するためのもので、文字列で作業していないの外に、それはあなたが(私の意見では)達成しようとしているもののためのビットやり過ぎだ。

助け

希望!

または多分ちょうど__toString()メソッドを持つオブジェクトとしてあなたの文字列をインスタンス化 - あなたはそれらを両方持つことができる方法 - オブジェクトと文字列としてそれを使用する機能(のvar_dumpを、エコー)..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top