Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Iterator nie implementujący interfejsu Iterator
bigZbig
post 9.02.2006, 13:07:20
Post #1





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
splatch
post 9.02.2006, 13:25:00
Post #2





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował splatch 9.02.2006, 13:26:37


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
mike
post 9.02.2006, 13:38:06
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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ł.
Go to the top of the page
+Quote Post
NuLL
post 9.02.2006, 17:39:15
Post #4





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


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.


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
mike
post 9.02.2006, 18:09:40
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
NuLL
post 9.02.2006, 18:13:05
Post #6





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


OT: Zgadzam sie - najwyrazniej lekko nie zrozumialem twojego posta.


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
splatch
post 9.02.2006, 19:35:00
Post #7





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>


Ten post edytował splatch 10.02.2006, 09:40:05


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
bigZbig
post 10.02.2006, 08:25:45
Post #8





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@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. ?>


Ten post edytował bigZbig 10.02.2006, 08:26:08


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.08.2025 - 23:26