2009-10-01 17 views
7

Ai đó đã đề nghị sử dụng SplObjectStorage để theo dõi một tập hợp những thứ độc đáo. Tuyệt vời, ngoại trừ nó không hoạt động với chuỗi. Một lỗi nói "SplObjectStorage :: attach() hy vọng tham số 1 là đối tượng, chuỗi được đưa ra trong fback.php trên dòng 59"SplObjectStorage không hoạt động với String, phải làm gì?

Bất kỳ ý tưởng nào?

Trả lời

8

SplObjectStorage là tên của nó cho biết: một lớp lưu trữ để lưu trữ các đối tượng. Ngược lại với một số ngôn ngữ lập trình khác, strings không phải là đối tượng trong PHP, chúng là, well, strings ;-). Do đó, không có ý nghĩa gì để lưu trữ các chuỗi trong một SplObjectStorage - ngay cả khi bạn quấn các chuỗi của bạn vào một đối tượng của lớp stdClass.

Cách tốt nhất để lưu trữ tập hợp các chuỗi duy nhất si để sử dụng mảng (dưới dạng hashtables) với chuỗi là khóa cũng như giá trị (như được đề xuất bởi Ian Selby).

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

Bạn tuy nhiên có thể quấn chức năng này vào một lớp tùy chỉnh:

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

    // ... 
} 

Bởi theo cách bạn san mô phỏng hành vi của SplObjectStorage cho PHP < 5.3.0 và để có được một sự hiểu biết tốt hơn về những gì nó làm.

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

SplObjectStorage cửa hàng một băm duy nhất cho mỗi trường hợp (như spl_object_hash()) để có thể xác định các trường hợp đối tượng. Như tôi đã nói ở trên: một chuỗi không phải là một đối tượng ở tất cả, do đó nó không có một thể hiện băm.Độ độc đáo của chuỗi có thể được kiểm tra bằng cách so sánh các giá trị chuỗi - hai chuỗi là bằng nhau khi chúng chứa cùng một tập hợp các byte.

1

Quấn chuỗi trong stdClass?

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

Tuy nhiên, mọi đối tượng được tạo theo cách này sẽ vẫn là duy nhất, ngay cả khi các chuỗi giống hệt nhau.

Nếu bạn cần phải lo lắng về chuỗi trùng lặp, có lẽ bạn nên sử dụng băm (mảng kết hợp) để theo dõi chúng thay thế?

+0

Bạn có thể cung cấp một số mẫu mã về cách lưu trữ một tập hợp các chuỗi duy nhất và sau đó lặp lại chúng? Tại sao nó khó khăn như vậy trong php ?? – erotsppa

+2

Bạn không thể lưu trữ chúng trong một mảng? Có vẻ như bạn đang làm phức tạp nhiều thứ một chút;) –

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

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

Nếu bạn muốn đảm bảo tính duy nhất của chuỗi trong mảng bạn có thể thực hiện một vài điều ... đầu tiên sẽ đơn giản là sử dụng array_unique(). Đó, hoặc bạn có thể tạo một mảng kết hợp với chuỗi như là chìa khóa cũng như các giá trị:

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

Nếu bạn muốn trở thành đối tượng theo định hướng về điều này, bạn có thể làm một cái gì đó như:

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 
} 

Sau đó, trong mã của bạn, bạn có thể làm công cụ như:

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

Và lặp cùng một cách:

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

SplObjectStorage là để theo dõi các trường hợp duy nhất của đối tượng, và bên ngoài không hoạt động với các chuỗi, đó là một chút overkill cho những gì bạn đang cố gắng để thực hiện (theo ý kiến ​​của tôi).

Hy vọng điều đó sẽ hữu ích!

5

Đó là Đối tượng Bộ nhớ. Chuỗi là một số vô hướng vô hướng. Vì vậy, hãy sử dụng SplString.

0

Hoặc Có lẽ chỉ cần nhanh chóng chuỗi của bạn như là một đối tượng với __toString) phương pháp (- cách mà bạn có thể có cả hai - đối tượng và khả năng sử dụng nó như là chuỗi (var_dump, echo) ..

Các vấn đề liên quan