Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [OOP] Iterowanie / interface Traversable
guci0
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.10.2008

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


Witam serdecznie!

Panowie lub Panie,
mam ogromna prośbe - siędzie nad tym już kilka ładnych godzin i zaraz będe
zmuszony poszukać młotka i dać sobie w głowę ...

Mam takie KLASY i INTERFEJSY:

Kod
interface Traversable {}

interface Iterator implements Traversable {
 function current();
 function key();
 function next();
 function rewind();
 function valid();
}

interface IteratorAggregate implements Traversable {
 public function getIterator();
}


i ...

Kod
class Collection implements IteratorAggregate {
...
public function getIterator() {
       $this->_checkCallback();
     return new CollectionIterator(clone $this);
   }
...
}

class CollectionIterator implements Iterator {

   private $_collection;
   private $_currIndex = 0;
   private $_keys;

   function __construct(Collection $objCol) {
      $this->_collection = $objCol;
      $this->_keys = $this->_collection->keys();
   }

   function rewind() {
      $this->_currIndex = 0;
   }

   function valid() {
      return $this->_currIndex < $this->_collection->length();
   }

   function key() {
      return $this->_keys[$this->_currIndex];
   }

   function current() {
      return $this->_collection->getItem($this->_keys[$this->_currIndex]);
   }

   function next() {
      $this->_currIndex++;
   }
}


Oczywiście nie wkleiłem całego kodu klasy Collection, sądzę iż nie
ma teraz takiej potrzeby. Przykład i implementacja klas/interfejsów biorę z ksiązki PHP5. Zaawansowane programowanie. Wiem, książka
ma sporo błędów i głównie właśnie jakieś psikusy zrobione są z interfejsami, choć w tym przypadku mogę się mylić...

Potrzebuje pomocy, wywolując program
APACHE zwraca:

Parse error: syntax error, unexpected T_IMPLEMENTS, expecting '{' in /Applications/MAMP/htdocs/folder/test/folder_base/class/class.Collection.php on line 8

Już nie wiem jak mam sobie z tym poradzić, dlatego
jeszcze raz proszę o POMOC!

Z góry BARDZO dziękuje
wszystkim zaangażowanym w rozwiązaniu problemu

Pozdrawiam

Paweł - guci0

P.S. Tak na marginesie to, coś słabo działa
edytor na forum (BBCODE)

Ten post edytował guci0 16.10.2008, 21:01:22
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Przeczytałeś treść błędu? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Cytat
Fatal error: Cannot redeclare class Iterator
Co można przetłumaczyć jako:
Cytat
Błąd krytyczny: Nie można ponownie zadeklarować klasy Interator
Czyli taka klasa/interfejs już istnieje.

W książce zapewne podali kod tych klas/interfejsów, abyś wiedział jak one wyglądają.
Go to the top of the page
+Quote Post
guci0
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.10.2008

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


Cytat(Crozin @ 17.10.2008, 08:09:55 ) *
W książce zapewne podali kod tych klas/interfejsów, abyś wiedział jak one wyglądają.
Już rozumiem, teraz zakomentowałem interfejsy w klasie Collection, następnie
zaimplementowałem interfejs IteratorAggegate (wbudowany).

Klasa Collection posiada metode publiczną getIterator(), która
to zwraca obiekt CollectionIterator, ten swoją drogą implementuje interfejs Iterator (wbudowany).

Output ProductCOLLECTION wygląda tak:
Kod
ProductCollection Object
(
    [_members:private] => Array
        (
            [1] => Product Object
                (
                    [id:private] => 1
                    [name:private] => name1
                    [promotion:private] => false
                    [new:private] => true
                )

            [4] => Product Object
                (
                    [id:private] => 2
                    [name:private] => name3
                    [promotion:private] => true
                    [new:private] => true
                )

        )

    [_onload:private] => 
    [_isLoaded:private] => 
)


Następnie chcąc przeIterować obiekt ProductCollection (dziedziczy po Collection, a wiec z interfejsami
też powinno być wszystko OK! [chyba?]),

Kod
 foreach ($objProductCollection as $key => $val) {
     echo "key/value: [$key -> $val]\n\n";
 }


i zwraca błąd: Catchable fatal error: Object of class Product could not be converted to string

Czy ja w ogóle ide w dobrą stronę?

EDIT: Idąc przykładem z http://pl2.php.net/manual/pl/language.oop5.iterations.php (trochę go zmieniłem, przede wszystkim zamiast wartości dodałem obiekty do klasy MyCollection, poprzez metode add(new Product("name"))

i wiem, że tu chodzi właśnie o OBIEKTY w Collection.

Mam, teraz cos takiego
Kod
MyCollection Object
(
    [items:private] => Array
        (
            [0] => Product Object
                (
                    [name:private] => nazwa 1
                )
            [1] => Product Object
                (
                    [name:private] => nazwa 2
                )
            [2] => Product Object
                (
                    [name:private] => nazwa 3
                )
        )
    [count:private] => 3
)


Jak mogę to przeITEROWAĆ? Miałobyć łatwo, a
nie jest - ah...

EDIT: A czy w ogóle jest sens tak to robić? Czy może
powinienem użyc GenericObjectCollection ? WALCZE dalej...

Ten post edytował guci0 17.10.2008, 13:19:23
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 5.10.2025 - 08:21