SplobjectStorage لا يعمل مع سلسلة، ماذا تفعل؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

اقترح شخص ما على E لاستخدام SplobjectStorage لتتبع مجموعة من الأشياء الفريدة. عظيم، إلا أنه لا يعمل مع سلاسل. خطأ يقول "SplobjectStorage :: Abook () يتوقع المعلمة 1 أن تكون كائن، سلسلة موجودة في fback.php على السطر 59"

أيه أفكار؟

هل كانت مفيدة؟

المحلول

ال SplObjectStorage هو ما يقوله اسمه: فئة تخزين لتخزين الكائنات. على النقيض من بعض لغات البرمجة الأخرى strings ليست كائنات في PHP، وهي كذلك، سلاسل ؛-). لذلك لا معنى لتخزين السلاسل في SplObjectStorage - حتى لو قمت بلف سلاسلك في كائن من الفصل stdClass.

أفضل طريقة لتخزين مجموعة من السلاسل الفريدة SI لاستخدام المصفوفات (مثل Hashtables) مع السلسلة مثل المفتاح وكذلك القيمة (كما اقترح إيان سيلبي).

$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()) لتكون قادرة على تحديد مثيلات الكائنات. كما قلت أعلاه: سلسلة ليست كائنا على الإطلاق، فلن يكون له مثيل له. يمكن التحقق من تفرد السلسلة من خلال مقارنة قيم السلسلة - سلاسلان متساوية عندما تحتوي على نفس مجموعة البايتات.

نصائح أخرى

انه ... انها هدف تخزين. سلسلة هي العددية. وبعد لذلك استخدام 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