2009-10-01 9 views
7

किसी ने अद्वितीय चीज़ों के एक सेट को ट्रैक रखने के लिए SplObjectStorage का उपयोग करने के लिए ई को सुझाव दिया है। बढ़िया, सिवाय इसके कि तारों के साथ काम नहीं करता है। एक त्रुटि कहती है "SplObjectStorage :: संलग्न() पैरामीटर 1 ऑब्जेक्ट होने की अपेक्षा करता है, लाइन 59 पर fback.php में दी गई स्ट्रिंग 59"SplObjectStorage स्ट्रिंग के साथ काम नहीं करता है, क्या करना है?

कोई विचार?

उत्तर

8

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

    // ... 
} 

जिस तरह से आप सान पीएचपी < 5.3.0 और के लिए SplObjectStorage के व्यवहार अनुकरण करके यह क्या का एक बेहतर समझ पाने के लिए कर देता है।

$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()) के लिए एक अनूठा हैश वस्तु उदाहरणों की पहचान करने में सक्षम हो। जैसा कि मैंने उपर्युक्त कहा है: एक स्ट्रिंग बिल्कुल एक वस्तु नहीं है, इसलिए इसका कोई उदाहरण हैश नहीं है।स्ट्रिंग मानों की तुलना करके एक स्ट्रिंग की विशिष्टता की जांच की जा सकती है - दो स्ट्रिंग बराबर होती हैं जब उनमें बाइट्स का एक ही सेट होता है।

1

एक stdClass में स्ट्रिंग लपेटें?

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

हालांकि, इस तरह से बनाई गई हर वस्तु इस तरह से अद्वितीय होगी, भले ही स्ट्रिंग समान हों।

यदि आपको डुप्लिकेट स्ट्रिंग्स के बारे में चिंता करने की ज़रूरत है, तो शायद आपको उन्हें ट्रैक करने के लिए हैश (एसोसिएटिव सरणी) का उपयोग करना चाहिए?

+0

आप कुछ नमूना प्रदान कर सकते हैं अद्वितीय तारों के सेट को स्टोर करने के तरीके पर कोड और फिर उन पर फिर से शुरू करें? PHP में इतना मुश्किल क्यों है ?? – erotsppa

+2

क्या आप उन्हें सिर्फ एक सरणी में स्टोर नहीं कर सके? ऐसा लगता है कि आप चीजों को थोड़ा जटिल बना रहे हैं;) –

0
$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 ऑब्जेक्ट्स के अनूठे उदाहरणों को ट्रैक करने के लिए है, और तारों के साथ काम नहीं करने के बाहर, यह आपके द्वारा पूरा करने की कोशिश कर रहा है (मेरी राय में) के लिए थोड़ा अधिक है।

आशा है कि मदद करता है!

5

यह ऑब्जेक्ट संग्रहण है। एक स्ट्रिंग स्केलर है। तो SplString का उपयोग करें। इस तरह आप उन दोनों को हो सकता है - -

0

या हो सकता है कि सिर्फ __toString के साथ एक वस्तु() विधि के रूप में अपने स्ट्रिंग का दृष्टांत वस्तु और स्ट्रिंग के रूप में उपयोग करने की क्षमता (var_dump, मेल खाती है) ..

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^