![]() |
![]() ![]() |
![]() |
![]()
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 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 24 Pomógł: 3 Dołączył: 25.08.2005 Ostrzeżenie: (0%) ![]() ![]() |
http://php.net/interface#language.oop5.int...es.examples.ex2
Interfejsy rozszerza się stosując słowo kluczowe extends, a nie implements. Dlaczego stworzyłeś własne interfejsy Traversable, Iterator oraz IteratorAggregate? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 16.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
http://php.net/interface#language.oop5.int...es.examples.ex2 Dzieki, cos poszło - jednak terazInterfejsy rozszerza się stosując słowo kluczowe extends, a nie implements. jest zwracany błąd: Fatal error: Cannot redeclare class Iterator Dlaczego stworzyłeś własne interfejsy Traversable, Iterator oraz IteratorAggregate? Wiesz, programowania obiektowego jeszcze się uczę, aw książce, przynajmniej tak mi sie wydaje, że tak "każą" ... Jak inaczej moge skorzystać z wbudowanych interfejsów albo jak mogę uniknąć błędu? Ten post edytował guci0 16.10.2008, 21:44:58 |
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Jak inaczej moge skorzystać z wbudowanych interfejsów? Po prostu skorzystać. One są wbudowane.Zerknij na to co już masz: SPL - Standard PHP Library |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 16.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Zerknij na to co już masz: SPL - Standard PHP Library Kurde, hmmm...Nie wiem jak tego użyć. Próbuje i próbuje, ale cały czas nie ide do przodu tylko same nie wiadome... Pomyśle jeszcze rano, świeże siły - być może to coś da ![]() Ten post edytował guci0 16.10.2008, 22:08:53 |
|
|
![]()
Post
#6
|
|
![]() 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?
![]() 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ą. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 16.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
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ępniezaimplementował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 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 24 Pomógł: 3 Dołączył: 25.08.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 16.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Jeśli chcesz użyć metody echo dla obiektu to koniecznie musi mieć on metode __toString(). Jeśli chcesz wyświetlić zawartość obiektu to możesz np. zrobić var_dump($value)
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 16.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
Pozwólcie że ze swoim pytaniem dokleję się tutaj.
Po jakiego diabła ten interfejs, do czego on służy, po co on jest? Cytat Interface to detect a class is traversable using foreach. Wszyyyyystkoooo jaaasneee...I nadal nie rozumiem po co on jest. Wszystkie kolekcje działają mi z zaimplementowanym tylko interfejsem Iterator. |
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
Intercafe Traversable jest po to stworzony, by interpreter języka wiedział, że dany obiekt może być interowany za pomocą pętli foreach. Implementacja tego interface-u nic nie da, ponieważ jest on pusty. Zamiast tego należy implementować interface Iterator.
-------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
![]()
Post
#14
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
~orglee to masz za jakiś tandetny słownik.
Zerknij tu: Traversable Zresztą wywaliłem z Twojego posta fragmety słownika. Nie wiem po kiego wała je wkleiłeś. Zajmowały sporo miejsca, robiły śmietnik a jak sam zauważyłeś nic nie wnoszą i nie tłumaczą. Po jakiego diabła ten interfejs, do czego on służy, po co on jest? Czasami stosuje się puste interfejsy. W Javie mówi się na nie Marker Interface. Interfejsy takie nie nakazują implementacji czegokolwiek (bo niby co miałyby nakazywać skoro są puste) tylko oznaczają coś. Dobrym przykładem jest Clonable, interfejs nie wprowadza konieczności implementowania czegokolwiek tylko wskazuje na klasy, których obiekty mogą być klonowane.Takim właśnie interfejsem jest Traversable. Oznacza on obiekty klas, które pozwalają na przechodzenie po sobie za pomocą pętli. Wszystkie kolekcje działają mi z zaimplementowanym tylko interfejsem Iterator. Działa Ci bo Iterator dziedziczy po Traversable.
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
Hmm zaraz zaraz. Interfejsy nie mogą implementować innych interfejsów. Aha dziedziczy! Ok teraz już rozumiem. Tak mi się wydawało, że do tego służy. Jednak przez wzgląd na brak możliwości implementowania interfejsów przez inne interfejsy jakoś mi się to nie kleiło. Dzięki.
mike: Dodatkowo dzięki za słownik. Już go sobie do zakładek dodałem. ![]() Swoją drogą na http://www.php.net/~helly/php/ext/spl/interfaceIterator.html, mogliby dodać notatkę, że Iterator rozszerza Traversable, bo tych diagramów to nigdy czytać mi się nie chce :F |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 07:34 |