![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 28 Pomógł: 1 Dołączył: 3.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie. Jak czytałem na kilku forach książka (php i mysql. tworzenie stron www. vademecum profesjonalisty. wydanie czwarte) posiada trochę błędów i nie należy ponoć do wybitnych. Chodzi mi o pewien przykład z rozdziału 31 - "tworzenie forum www". Wydaje mi się, iż pomóc mogą mi osoby, które posiadają tą książkę. Jest tam klasa, która ma służyć do budowy drzewa artykułów tegoż forum. To nie cały listing tej klasy, ale wystarczy do objaśnienia problemu :
A to listing gdzie tworzony jest egzemplarz tej klasy :
Więc od początku. Gdy tworzony jest egzemplarz tej klasy,funkcja konstrukcyjna sprawdza czy dany artykuł posiada dzieci, następnie tworzony jest nowy egzemplarz tej klasy przez co funkcja konstrukcyjna znów.... i tak dalej i tak dalej... Chodzi mi głownie o tą część :
Dajmy na to że mamy dwa artykuły A i B na poziomie "0". Następnie dwa artykuły C i D gdzie C jest dzieckiem A i D jest dzieckiem C. Czyli A->C->D i B obok A. Gdy tworzony jest pierwszy egzemplarz klasy konstruktor sprawdza w badzie że są dwa artykuły na "0" poziomie ( A i B ) . Pobiera ich dane. Następnie w bloku iteracyjnym tworzony jest nowy egzemplarz (który jest tablicą) omawianej klasy : c_lista_pot[0] i tam następuje znów wywołanie konstruktora, potem iteracja i znów tworzony jest egzemplarz omawianej klasy: c_lista_pot[0]. Więc co mamy dwa egzemplarze c_lista_pot[0] ? Chyba że ja czegoś nie rozumiem. Przecież jak będzie kilka gałęzi to każdy pierwszy element będzie c_lista_pot[0] bo indeks pochodzi od funkcji iteracyjnej.. To samo tyczy się zmiennej $glebokosc+1. Przecież gdy kończy analizowanie danej gałęzi i wraca do góry drzewa aby analizować kolejną gałąź to musi ta zmienna się zerować aby głębokość pierwszego elementu tej gałezi była 0. Mam nadzieję, że nie zamieszałem zbytnio, i faktem jest jak już pisałem wcześniej, że najlepiej jeśli ktoś posiada tą książkę aby mi pomóc. W razie czego mogę więcej napisać informacji z książki. Pozdrawiam GreeN -------------------- - WWW.GETICA.PL - strony WWW, logotypy, ilustracje - ZAPRASZAMY!
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
To jest normalna rekurencja i wydaje mi się po tym, co napisałeś, że zupełnie jej nie rozumiesz. Każde wywołanie funkcji/metody posiada własny zestaw zmiennych i osobny wpis na stosie wywołań. Jeśli wywołanie nr 5 sobie zmienia wartość jakiejś zmiennej, to ta zmiana jest widoczna wyłącznie w tym wywołaniu i nie wpływa na działanie innych funkcji. Tak samo jest z $c_lista_pot - każdy obiekt ma własną listę.
Już tak na marginesie... jeśli tak wyglądają przykłady w tej książce, to weź Ty sobie lepiej zmień źródło, z którego się uczysz. Nie wywołuje się rekurencyjnie zapytań SQL! To jest przecież wzorcowa wręcz metoda zajechania bazy danych. Liczba zapytań, jakie dane żądanie HTTP może wysłać do bazy danych, powinna być ograniczona z góry jakąś stałą wartością na zasadzie "ta akcja może wysłać 4, 5 lub 6 zapytań w zależności od jakichś ustawień, ale nigdy więcej". -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 28 Pomógł: 1 Dołączył: 3.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Czy jesteś mi w stanie to dokładniej wytłumaczyć? Czyli mogą istnieć obiekty o tych samych nazwach? No bo tak to zrozumiałem, bo każda gałąź główna staje się tablicą i te tablice mają te same nazwy. Te tablice, które wyrażają daną gałąź drzewa układają się na stosie? Czy mógłbyś podać sensowne publikacje które mogą przybliżyć mi programowanie obiektowe?
Ten post edytował GreeN_DG 27.01.2011, 13:53:09 -------------------- - WWW.GETICA.PL - strony WWW, logotypy, ilustracje - ZAPRASZAMY!
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Nie ma czegoś takiego, jak "nazwa obiektu". Jest nazwa klasy, a klasa to coś zupełnie innego, niż obiekt. Może istnieć co najwyżej jedna klasa o nazwie X, może istnieć dowolna liczba obiektów klasy X.
http://pl.wikibooks.org/wiki/PHP/Czym_jest...ie_obiektowe%3F -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 28 Pomógł: 1 Dołączył: 3.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dziękuje za odpowiedź. Czyli jeśli dobrze rozumiem w tym momencie :
c_lista_pot[$licznik]= new wezel_drzewa..... tworzony jest za każdym razem nowy obiekt klasy "wezel_drzewa" który jako indywiduum może posiadać własne właściwości (pola) (nie ważne że to będzie kilka razy c_lista_pot[0]) i każdy ten obiekt kolejno odkładany jest na stos? Jedynym sposobem potem w kolejnej funkcji dostania się do danego obiektu jest zdejmowanie po kolei obiektów ze stosu aż dojdziemy do pożądanego? Bo takim czymś : $this->c_lista_pot[]->Coś tam... wskażemy na pierwszy obiekt leżący na stosie? -------------------- - WWW.GETICA.PL - strony WWW, logotypy, ilustracje - ZAPRASZAMY!
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Tak, każdy obiekt ma własne wartości wszystkich atrybutów, niezależne od innych obiektów tej samej klasy. Zatem też każdy obiekt reprezentujący artykuł posiada swoją własną listę potomków. Natomiast tu jeszcze taka uwaga: $c_lista_pot to lista, a nie żaden stos. Poczytaj sobie, czym jest jedno, a czym drugie w informatyce, ponieważ mylisz pojęcia.
-------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 28 Pomógł: 1 Dołączył: 3.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie rozumiem pewnej kwestii. Mając daną klasę "jedzenie" to czy :
$chleb = new jedzenie(); $chleb = new jedzenie(); $chleb = new jedzenie(); tworzone są trzy obiekty klasy jedzenie? bo w tamtym przykładzie jeśli założymy że jest znaczna ilość artykułów, wiele gałęzi to taki przypadek : c_lista_pot[0]= new wezel_drzewa..... powtórzy się wiele razy. ------------------------------------------------- edit. Widzę że cicho w temacie. Wydaje mi się że jeśli ma to być lista artykułów to powinno być zamiast tak
tak
Wtedy utworzy się lista gdzie dany rekord tablicy będzie wskazywał na dany obiekt (artykuł). ----------------- edit2 Napisałem bzdurę bowiem przecież nie jest powiedziane iż np. dziecko artykułu o id=2 będzie miało id=3. Zanim pojawi się odpowiedź na id=2 może pojawić się wiele nie związanych z nim artykułów. W tym wypadku przy kodzie co podałem wyżej powstanie lista artykułów o złej kolejności. Wynika z tego, że poprostu powinno być : <php>$this->c_lista_pot[kolejny rekord tablicy]= new wezel_drzewa...</php> Ten post edytował GreeN_DG 31.01.2011, 22:59:54 -------------------- - WWW.GETICA.PL - strony WWW, logotypy, ilustracje - ZAPRASZAMY!
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 15:42 |