![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
W książce natrafiłem na przykład, który wydaje mi się błędny. Wiem, że książki helionu mają literówki i różnego rodzaju błędy (na stronie helionu w erracie nie ma poprawki do tego), dlatego proszę o sprawdzenie poniższego kodu.
I teraz ten kod gdzie podejrzewam, że jest błąd..
Wydaje mi się, że błąd jest w metodzie validate(). Autor odwołuje suię w ten sposób
a powinno być chyba
jeśli nie to dlaczego właśnie tak? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 1 Dołączył: 16.04.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Zauważ, że masz funkcje __get() oraz __set() - pierwsza wykorzystywana jest wtedy kiedy robisz
druga kiedy:
Nawet, kiedy pole cos nie istnieje. Opisalem to tutaj: envp's devblog |
|
|
![]()
Post
#3
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Nie podoba mi się ten kod. Po pierwsze właściwość nie jest walidatorem, co najwyżej może być walidowana (czyli raczej Validable). Poza tym nie rozumiem, po co deklarować metodę validate, w klasie PropertyObject... Jest to typowy przykład zastosowania metody abstrakcyjnej, a nie bezsensownego wklepywania pustej...
Tak poza tym, to dlaczego my mamy to sprawdzać? Więcej się nauczysz, jak sam będziesz chciał to sprawdzić... Odpal skrypt, zdebuguj go xdebugiem czy czymś innym... |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Nie podoba mi się ten kod. Po pierwsze właściwość nie jest walidatorem, co najwyżej może być walidowana (czyli raczej Validable). Poza tym nie rozumiem, po co deklarować metodę validate, w klasie PropertyObject... Jest to typowy przykład zastosowania metody abstrakcyjnej, a nie bezsensownego wklepywania pustej... Coraz częściej dochodze do wniosku, że ta książka jest bardzo zamotana. Chyba tylko po to, żeby więcej stron było. Zauważ, że masz funkcje __get() oraz __set() - pierwsza wykorzystywana jest wtedy kiedy robisz Ok. Powoli łapie. Ale nie mogę zrozumieć tego kawałka kodu (z metody __get() ):
Po co sprawdza się czy metoda istnieje. Nie łapie też argumentów tej metody oraz call_user_func. Czytałem o tych funkjach ale nie mogę załapać. Możecie mi to wytłumaczyć? |
|
|
![]()
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Przepisałeś błędnie niektóre wywołania metod. Zamiast kropki (operator łączenia łańcuchów znakowych) wstawiłeś przecinek.
call_user_func" title="Zobacz w manualu php" target="_manual... Manual na pewno Ci wyjaśni znaczenie parametrów. Całe to zamieszanie jest po to, aby korzystać z metod getNazwaWłaściwości zamiast bezpośredniego odwoływania się do tablicy z danymi. Jeżeli nie istnieje metoda pobierająca dane, wtedy zwracana jest wartość bezpośrednio z tablicy... |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Przepisałeś błędnie niektóre wywołania metod. Zamiast kropki (operator łączenia łańcuchów znakowych) wstawiłeś przecinek.
Tak mam w książce. Ale naet jak powinna być kropka to nie ma sensu zapis $this.get.propertyName. Nie powinno być:
? Ogólnie w manulu piszą, że funkcja method_exists pobiera dwa parametry: instancje klasy, metode. Nie łapie tego. Zresztą przecież jak mamy metode magiczną __get() to nie odwołujemy się do niej przez $this->cos tylko $this->cos(); call_user_func" title="Zobacz w manualu php" target="_manual... Manual na pewno Ci wyjaśni znaczenie parametrów. Sprawdzałem. Podobnie jak w z method_exists nie rozumiem po co w środek wstawiane jest to get i array.. Całe to zamieszanie jest po to, aby korzystać z metod getNazwaWłaściwości zamiast bezpośredniego odwoływania się do tablicy z danymi. Jeżeli nie istnieje metoda pobierająca dane, wtedy zwracana jest wartość bezpośrednio z tablicy... Jaki jest sens? Przecież pisząć aplikacje pisze metodę, która pobiera dane, bo wiem, że tego będę potrzebował. I nie ma sensu mówić, że nad proejktem może pracować wiele osób. Bo nawet w takim przypadku jeden programista pisze i kończy daną klase i powinien takie metody dostępowe utworzyć.. |
|
|
![]()
Post
#7
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Powinno być
Pierwszy argument to instancja klasy. Drugi argument ('get' . $propertyName) to nazwa metody. Nie widzę nic dziwnego w tym wywołaniu... Dalej...
Tak samo... Pierwszy argument ma być typu callback. Jest to nazwa funkcji albo w przypadku wywoływania metod tablica. Pierwszy elementem tablicy jest referencja do obiektu (albo nazwa klasy, jeżeli wywołujemy statyczną metodę). Drugi element to nazwa metody. Oni to zrobili po to, aby przeciążyć "magiczne" metody, ale nie tracić zachowania metod programisty getXXX... Jeżeli istnieje metoda getWlasciwosc, a ty poprosisz o dane tak:
To i tak efektem będzie wywołanie metody getWlasciwosc... |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Powinno być
Pierwszy argument to instancja klasy. Drugi argument ('get' . $propertyName) to nazwa metody. Nie widzę nic dziwnego w tym wywołaniu... $this nie jest instancją klasy(?) getNazwaMetody samo w sobie nie jest dziwne. Dziwne jest to, że w przykładzie, który podałem na samym początku nie ma metody. Jest tylko magiczna (czyli jak dobrze przeczytałem wywoływana automatycznie gdy ktoś chce wywołać nieistniejącą metode), nie ma żadnej innej metody. Dalej...
Tak samo... Pierwszy argument ma być typu callback. Jest to nazwa funkcji albo w przypadku wywoływania metod tablica. Pierwszy elementem tablicy jest referencja do obiektu (albo nazwa klasy, jeżeli wywołujemy statyczną metodę). Drugi element to nazwa metody. Oni to zrobili po to, aby przeciążyć "magiczne" metody, ale nie tracić zachowania metod programisty getXXX... Jeżeli istnieje metoda getWlasciwosc, a ty poprosisz o dane tak:
To i tak efektem będzie wywołanie metody getWlasciwosc... Thx. |
|
|
![]()
Post
#9
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
$this jest referencją do obiektu, którego metoda jest wywoływana, czyli po ludzku - do samego siebie. Przy odczycie/przekazywaniu nie różni się niczym od innych referencji.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Analizuje ten przykład jeszcze raz i mam wrażenie, że autor troszke zamieszał. Czy metoda __get nie powinna raczej wyglądać tak:
Po co sprawdzać czy istnieje propertyName przed sprawdzeniem istnienia metody? Po to się to sprawdza (chyba) czy można zwrócić wartość z tablicy propertyTable..? |
|
|
![]()
Post
#11
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Tak też może być. Autor klasy zakładał, że nawet w przypadku istnienia metody dostępowej, należy sprawdzić czy dane istnieją w tablicy. Nie ma danych - metoda nie ma sensu...
U Ciebie istnieje możliwość wywołania metod get* nawet w przypadku, gdy dane w tablicy nie istnieją... Kod metody __set też mi się nie podoba... |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Tak też może być. Autor klasy zakładał, że nawet w przypadku istnienia metody dostępowej, należy sprawdzić czy dane istnieją w tablicy. Nie ma danych - metoda nie ma sensu... Po co? Jak istnieje metoda to ją wykonujesz a nie pobierasz wartość z tablicy. Jak napiszesz to sprawdzane jest czy istniej metoda getCostam, jeśli tak ją wywołujesz a jeśli nie to to zwraca
U Ciebie istnieje możliwość wywołania metod get* nawet w przypadku, gdy dane w tablicy nie istnieją... Jak wyżej. |
|
|
![]()
Post
#13
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Cytat Po co? Jak istnieje metoda to ją wykonujesz a nie pobierasz wartość z tablicy. Nie odpowiem na pytanie po co - bo nie jestem autorem tej klasy. Sam bym sprawdzał dopiero w przypadku braku metody dostępowej... |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Nie odpowiem na pytanie po co - bo nie jestem autorem tej klasy. Sam bym sprawdzał dopiero w przypadku braku metody dostępowej... Ale sam napisałeś: U Ciebie istnieje możliwość wywołania metod get* nawet w przypadku, gdy dane w tablicy nie istnieją... A to nieprawda - starałem się to wytłumaczyć w poscie wyżej.. :/ |
|
|
![]()
Post
#15
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Mylisz się. Przeanalizuj dobrze kod. Żeby wywołać metodę get* musi być spełniony warunek (w którym masz błąd składniowy, o którym już wcześniej pisałem...):
Czyli musi istnieć odpowiednia metoda. Nie ma tutaj żadnego sprawdzenia, czy metoda odwołuje się do istniejącego pola. To zadanie zostało powierzone właśnie metodzie dostępowej, a nie __get... Tak na prawdę fakt posiadania przez klasę metody getDziwnePole nie gwarantuje w Twoim przypadku posiadania tego pola... |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Czyli musi istnieć odpowiednia metoda. Nie ma tutaj żadnego sprawdzenia, czy metoda odwołuje się do istniejącego pola. To zadanie zostało powierzone właśnie metodzie dostępowej, a nie __get... Ok - zgadza się. Ale skąd wiesz, że metoda dostępowa tego nie sprawdza? Nie ma napisanego kodu metody dostępowej ale to chyba ona powinna sprawdzać i ewentualnie wyrzucić wyjątek. Tak na prawdę fakt posiadania przez klasę metody getDziwnePole nie gwarantuje w Twoim przypadku posiadania tego pola... Masz racje. Ale to metoda getDziwnePole powinna sprawdzić czy jest takie pole i jeśli jest to się wykonać a jeśli nie to throw... Moim zdaniem autor mota bardzo. Pozatym zaglębiając się bardziej w przykłady nie jestem przekonany czy tą książkę pisali experci.. |
|
|
![]()
Post
#17
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Cytat Ok - zgadza się. Ale skąd wiesz, że metoda dostępowa tego nie sprawdza? Nie ma napisanego kodu metody dostępowej ale to chyba ona powinna sprawdzać i ewentualnie wyrzucić wyjątek. Powinna, ale zbytnie zaufanie do programisty stwarza dodatkowe niebezpieczeństwo powstania błędów w kodzie. Co nie zmienia faktu, że ten błąd wyjdzie przy testach i jest raczej niegroźny, a wklepanie tego warunku spowoduje lekką stratę wydajności. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
(..)a wklepanie tego warunku spowoduje lekką stratę wydajności. A waruenk przed sprawdzaniem nie wpływa na wydajność? Będzie to samo.. Chyba że się myle.. EDIT: Dręczy mnie ejszcze jedna sprawa na którą nie uzyskłame odpowiedzi. Wydaje mi się, że błąd jest w metodzie validate(). Autor odwołuje suię w ten sposób
a powinno być chyba
jeśli nie to dlaczego właśnie tak? Ten post edytował J4r0d 21.08.2006, 22:23:15 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.09.2025 - 18:20 |