Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Iterator nie implementujący interfejsu Iterator
Forum PHP.pl > Forum > PHP > Object-oriented programming
bigZbig
Co sadzicie o uzyciu takiego rozwiazania do budowy klasy kolekcji oraz iteratora. Oczywiscie pare dodatkowych metod trzeba by bylo dorobic.

  1. <?php
  2.  
  3. class MyObiectColection
  4. {
  5. public $object1 = 'tu oczywiscie zamiast stringa bedzie obiekt1';
  6. public $object2 = 'obiekt2';
  7. public $object3 = 'obiekt3';
  8.  
  9.  
  10. protected $protected = 'protected var';
  11. private  $private  = 'private var';
  12.  
  13.  
  14. function addObject($name, $object) {
  15. $this->$name = $object;
  16. }
  17. }
  18.  
  19. $class = new MyObiectColection();
  20. $class->addObject('object4', 'obiekt4');
  21. $class->addObject('object5', 'obiekt5');
  22.  
  23. foreach($class as $key => $value) {
  24. print("$key => $value <br />\n");
  25. }
  26. ?>


Czy widziecie w tym jakies korzyści w stosunku do tradycyjnej klasy kolekcji bedacej obiektowa otoczka dla tablicy polaczonej z kolejnymi klasami implementujacymi interfejsy Iterator oraz IteratorAggregate? Jesli nie to jakie widzicie najwazniejsze wady (nie liczac definiowania wlasciwosci w funkcji nieazadeklarowanej w klasie)?

Zaznaczam ze idea tego pomyslu zostala zaczerpnieta z manuala
splatch
Czy nie lepiej zastosować już istniejącą klasę ArrayIterator? Dodajesz gratis część metod plus dodatkowo zachowujesz funkcjonalność i zgodność z interfejsem Iterator smile.gif.
  1. <?php
  2. class MyCollection extends ArrayIterator {
  3. public function addObject($name, $value) {
  4. $this->$name /* jak chcesz to obsluzyc? */ = $value;
  5. }
  6. }
  7. ?>
mike
1. Pomijam pomysł wynajdywania koła na nowo. Już samo to nie ma sensu.
2. Druga sprawa jest związana z obsługą tej kolekcji. Ta metoda, którą zacytował ~splatch nie ma szans działania. Przecież nie stworzysz dynamicznie pól klasy. Kolekcję taką możesz stworzyć co najwyżej na tablicach. A wtedy nie dość że napiszesz coś co "działa" jak iterator a na siłę go omija, to jeszcze coś co jest jedną wielką nakładką na funkcje tablicowe.

Podsumowując: Po co?

Bezsensowny pomysł.
NuLL
Cytat
Przecież nie stworzysz dynamicznie pól klas

I tu sie mylisz rolleyes.gif da sie -> http://forum.php.pl/index.php?showtopic=38082 - ostatni moj post w tym temacie. Ja osobiscie jako kolekcje widze tylko kolekcje obiektow smile.gif Kolekcja reprezentuje tabele a genericObject wiersz w tej tabeli. Calosc mozna latwo sortowac wedle danego pola klasy wbrew pozorom.
mike
Cytat
I tu sie mylisz rolleyes.gif da sie -> http://forum.php.pl/index.php?showtopic=38082 - ostatni moj post w tym temacie.

Dokładnie to miałem na mysli pisząc:
Cytat(mike_mech @ 2006-02-09 13:38:06)
Kolekcję taką możesz stworzyć co najwyżej na tablicach. (...) jest jedną wielką nakładką na funkcje tablicowe.

Całość można tylko osiągnąć bawiąc się jednym polem - tablicą.
Czy to w połączeniu z bazą, czy też nie.
NuLL
OT: Zgadzam sie - najwyrazniej lekko nie zrozumialem twojego posta.
splatch
Cytat
Przecież nie stworzysz dynamicznie pól klas

można to obsłużyć za pomocą __get i __set traktując nazwę pola jako klucz w chronionej tablicy fields.
  1. <?php
  2. class MyCollection {
  3.  
  4. protected $fields = array();
  5.  
  6. public function __get($var) {
  7. return $this->fields[$var];
  8. }
  9.  
  10. public function __set($var, $val) {
  11. $this->fields[$var] = $val;
  12. }
  13.  
  14. public function setFields($fields) {
  15. $this->fields = array_merge($this->fields, $fields);
  16. }
  17. }
  18. ?>
bigZbig
@splatch - a moze jednak tak?

  1. <?php
  2. class Collection implements ArrayAccess,IteratorAggregate
  3. {
  4. public $aCollection = array();
  5.  
  6. function offsetExists($key)
  7. {
  8. return (isset($this->aCollection[$key])) ? true : false;
  9. }
  10.  
  11. function offsetGet($key)
  12. {
  13. return ($this->offsetExists($key)) ? $this->aCollection[$key] : false;
  14. }
  15.  
  16. function offsetSet($key, $value)
  17. {
  18. if ($key) {
  19. $this->aCollection[$key] = $value;
  20. } else {
  21. $this->aCollection[] = $value;
  22. }
  23. }
  24.  
  25. function offsetUnset($key)
  26. {
  27. unset ($this->aCollection[$key]);
  28. }
  29.  
  30. function getIterator()
  31. {
  32. return new ArrayIterator($this->aCollection);
  33. }
  34. }  
  35. ?>

Teraz mozna zrobic tak
  1. <?php
  2. $collection = new Collection();
  3.  
  4. $collection[] = new myObject();
  5. $collection['foo'] = new myObject();
  6.  
  7. foreach ($collection as $key => $object)
  8. {
  9. echo $key.' => '.$object->getName()."<br />\r\n";
  10. }
  11.  
  12. unset($collection['foo']);
  13.  
  14. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.