SplObjectStorage ne, dize ile çalışmıyor?

5 Cevap php

Biri benzersiz şeylerin bir dizi takip etmek için SplObjectStorage kullanmak e önerdi. Büyük, bu dizeleri ile çalışmaz dışında. Bir hata "SplObjectStorage :: hattında 59 fback.php verilen dize, parametre 1 nesne olmasını bekler () takın" diyor

Herhangi bir fikir?

5 Cevap

SplObjectStorage is what its name says: a storage class for storing objects. In contrast to some other programming languages strings onlar, iyi, dizeleri ;-) vardır, PHP nesneler değildir. Eğer sınıfın bir nesne içinde dizeleri sarın bile stdClass - Bu nedenle bir SplObjectStorage dizeleri depolamak için hiçbir mantıklı.

Eşsiz dizeleri bir koleksiyonu saklamak için en iyi yolu (Ian Selby tarafından önerilen) tuşu yanı sıra değer olarak dize ile (hashtables gibi) diziler kullanmak si.

$myStrings = array();
$myStrings['string1'] = 'string1';
$myStrings['string2'] = 'string2';
// ...

Ancak özel bir sınıf bu işlevselliği sarın:

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;
    }

    // ... 
}

Eğer san PHP SplObjectStorage davranışını simüle arada 5.3.0 ve ne yaptığını daha iyi anlamak için.

$ob1 = new stdClass();
$id1 = spl_object_hash($ob1);
$ob2 = new stdClass();
$id2 = spl_object_hash($ob2);
$objects = array(
    $id1 => $ob1,
    $id2 => $ob2
);

SplObjectStorage stores a unique hash for each instance (like spl_object_hash()) to be able to identify object instances. As I said above: a string is not an object at all, it therefore does not have an instance hash. A string's uniqueness can be checked by comparing the string values - two strings are equal when they contain the same set of bytes.

Bir Object Depolama bulunuyor. Bir dize bir scalar olduğunu. Yani kullanmak SplString.

Bir stdClass dize sarın?

$dummy_object = new stdClass();
$dummy_object->string = $whatever_string_needs_to_be_tracked;
$splobjectstorage->attach($dummy_object);

Ancak, bu şekilde oluşturulan her nesne hala dizeleri aynı olsa bile, benzersiz olacaktır.

Yinelenen dizeleri hakkında endişelenmenize gerek, belki de yerine onları izlemek için bir karma (ilişkisel dizi) kullanarak olmalıdır?

$myStrings = array();
$myStrings[] = 'string1';
$myStrings[] = 'string2';
...

foreach ($myStrings as $string)
{
    // do stuff with your string here...
}

Siz) İlk sadece (array_unique kullanmak olacaktır ... Eğer bir kaç şey yapabileceğini dizide dizeleri teklik sağlamak istedim. Yani, ya da tuşları yanı sıra değerleri olarak dizeleri ile ilişkilendirilebilir bir dizi oluşturabilirsiniz:

$myStrings = array();
$myStrings['string1'] = 'string1';
...

Nesne yönelimli bu konuda olmak istiyorsa, böyle bir şey yapabilirsiniz:

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
}

Ardından, kod sizin gibi şeyler yapabilirsiniz:

StringStore::$strings[] = 'string1';
...

Ve aynı şekilde yineleme:

foreach (StringStore::$strings as $string)
{
    // whatever
}

SplObjectStorage Objects eşsiz örneklerini izleme ve dizeleri ile çalışma dışında, bu (bence) gerçekleştirmek için çalışıyoruz ne için biraz overkill.

Umarım ki olur!

Veya belki sadece __ toString () yöntemi ile bir nesne olarak dize örneğini - ikisini de olabilir bu şekilde - nesne ve dize (var_dump, eko) olarak kullanma yeteneği ..