![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 180 Pomógł: 0 Dołączył: 24.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Najpierw podam kod:
Klasa String:
Klasa Coment:
Odwołanie:
Zastosowałem tutaj IMHO brzydkie rozwiązanie z użyciem metody __call. Innym rozwiązaniem jest zastosowanie public $title. Wówczas odwoływalibyśmy się w ten sposób:
Czyli bez użycia title(). Jednak chyba nie jest to zbyt dobry pomysł ponieważ zmienna będzie publicznie dostępna, a takto mamy tylko dostęp do jej metod (title->set, title->length, etc.), więc nie można jej np. usunąć z zewnątrz. Żeby nie zakładać nowego tematu napiszę, że brakuje mi bardzo przeładowywania metod w taki oto sposób:
Jestem ciekaw jak sobie radzicie z tym problemem. -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) ![]() ![]() |
IMO klasa Comment powinna wyglądać tak:
I potem odwołujesz się tak:
Ten post edytował matid 2.07.2005, 20:07:00 |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 180 Pomógł: 0 Dołączył: 24.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Oczywiście wiem o tym ;-) Zapomniałem dopisać to rozwiązanie na Forum. Obecnie korzystam właśnie z takiego
Trochę pokręciłem. To które podałeś matid wydaje się najrozsądniejsze i najbezpieczniejsze. Jednak czy istnieje jeszcze inne rozwiązanie? Może jakieś wariacje z __get i __call? Chodzi mi o to, aby odwołać się poprzez Jednak jeśli użyję __get to i tak nie sprawdzi się to, ponieważ zmienna $title istnieje i nie dojdzie do wykonania metody __get. Innym rozwiązaniem może być dodanie jakiegoś przedrostka np. get_ (gdzieś widziałem klasę z wariacją __get lub _call (już nie pamiętam) i przedrostka get_ (wartość) lub Get (odwołanie do metody). Jednak to mija się z celem, już lepiej stworzyć metodę GetTitle() i zwrócić referencję do obiektu, która to jest domyślnie zwracana w php 5. Zależy mi na tym by wartość była private ze względów bezpieczeństwa. Jestem ciekaw jak rozwiąże to Seth w swoim frameworku Carbon, który ma się odwoływać m.in. tak w swoim systemie szablonów
Pozostaje chyba jedynie albo zastępować np. content na getConent(), nowosci na getNowosci() albo zmienić access z private na public. Druga kwestia Przeładowywanie metod. Czy pozostaje jedynie rozwiązanie przez stworzenie setterów?
O ile łatwiej by było gdyby:
Można oczywiście skorzystać z funkcji func_get_args" title="Zobacz w manualu PHP" target="_manual Ten post edytował dag 2.07.2005, 19:14:33 -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 9.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Jednak jeśli użyję __get to i tak nie sprawdzi się to, ponieważ zmienna $title istnieje i nie dojdzie do wykonania metody __get. Czyżby ? ![]() ( notka by Dasko ![]() |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 180 Pomógł: 0 Dołączył: 24.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(dasko @ 2005-07-02 20:14:49) Cytat Jednak jeśli użyję __get to i tak nie sprawdzi się to, ponieważ zmienna $title istnieje i nie dojdzie do wykonania metody __get. Czyżby ? ![]() ( notka by Dasko ![]() Czytałem czytałem i to wielokrotnie ;-) Dla leniwych:
Cytat The feature was tested on php 5.1-dev. Ja mam php Version 5.0.3 i wyskakuje mi Cytat Cannot access private property MyClass::$foo
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 9.11.2004 Ostrzeżenie: (0%) ![]() ![]() |
Pozostaje mi polecić php 5.1
![]() |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) ![]() ![]() |
Skoro chcesz się odwoływać do tego w ten sposób:
$cm->title->lenght(); No to jakby na to nie patrzeć 'title' jest własnością publiczną i żadna kwestia bezpieczeństwa nie jest naruszona. Jest to wprawdzie przeciw zasadzie hermetyzacji, no ale skoro koniecznie tego potrzebujesz to chyba innego wyjścia nie ma. Ten post edytował matid 2.07.2005, 20:11:41 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 180 Pomógł: 0 Dołączył: 24.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(matid @ 2005-07-02 21:10:50) Skoro chcesz się odwoływać do tego w ten sposób: $cm->title->lenght(); No to jakby na to nie patrzeć 'title' jest własnością publiczną i żadna kwestia bezpieczeństwa nie jest naruszona. Jest to wprawdzie przeciw zasadzie hermetyzacji, no ale skoro koniecznie tego potrzebujesz to chyba innego wyjścia nie ma. Właśnie dlatego nie chcę aby $title było public. Zaciekawiło mnie to ponieważ Seth podawał na swoim blogu koncepcję swojego frameworka i odwoływał się w przykładzie właśnie w ten sposób. Zostaję przy private i stworzeniu gettera. Ciekawi mnie jeszcze druga kwestia, którą opisałem mianowicie jak sobie radzicie z przeładowywaniem metod. Czy korzystacie z funkcji func_get_args i tym podobnych czy raczej jesteście za tworzeniem dodatkowych setterów?
Myślę, że to będzie najrozsądniejsze rozwiązanie. Jeśli będę chciał odwołać się do jakiejś metody String przesłonię ją (Facade) w klasie Comment. Ten post edytował dag 2.07.2005, 20:29:11 -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) ![]() ![]() |
Ja osobiście nie lubię dodawać kolejnych setterów do containera. U mnie container ma zwracać poszczególne instancje, dodawać je lub usuwać. Czyli robie np. tak:
Ale jak to mówią - każdy robi jak mu się podoba ![]() |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 180 Pomógł: 0 Dołączył: 24.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(matid @ 2005-07-02 21:36:21) Ja osobiście nie lubię dodawać kolejnych setterów do containera. U mnie container ma zwracać poszczególne instancje, dodawać je lub usuwać. Czyli robie np. tak:
Ale jak to mówią - każdy robi jak mu się podoba ![]() Masz rację ;-) Coś dzisiaj ciężko idzie mi myślenie ;-) Co będzie jeśli rozbuduję klasę String? Aż strach pomyśleć ;-) Dodawanie nowej funkcjonalności (czyli nowych metod) w innych klasach ;/ a takto jedynie zostanie mi korzystanie z nowych features ;-) -------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 105 Pomógł: 0 Dołączył: 16.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Z metodami __get() czy też może i __call() trzeba bardzo uważać. Ja kiedyś sobie przez __get() pobierałem moduły jądra i jakież moje zdziwienie było, kiedy pojawiały mi się błędy... Powód? Pobrany moduł przez __get() chciał pobrać inny moduł. Myślałem, że tak się da, a jednak PHP5(1) ma blokade na takie odwołania (ochrona przed zapętleniem).
(1) Było to kilka miesięcy temu, dopisałem się do innego zgłoszenia na bugtracku, nie wiem jak jest obecnie - warto wpierw sprawdzić to, zanim będzie się używać. -------------------- Com powiedział, powiedziałem.
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
@dag: Rozwiązanie jest proste:
Co do przeładowania konstruktora: robienie dodatkowych setterów nie wchodzi w grę, bo to zupełnie inna funkcjonalność niż konstruktor z wieloma parametrami. Nie widzę przeszkód w dodaniu wartości domyślnej i func_get_args. @matid: A czy ten Container nie przypomina za bardzo hashmapy ![]() |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 180 Pomógł: 0 Dołączył: 24.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Ciekawi mnie kwestia kropki i przecinka. Gdy jest kropka php nie wykonuje metody __toString(), a gdy przecinek wykonuje. Gdy zastosujemy przecinek to czy jest równoznaczne z:
![]() Najlpeszmy i "najczystszym" rozwiązaniem było by chyba wprowadzenie czwartego typu access ;-), który by miał większość właściwości private jednak pozwalał by na zwrócenie obiektu. ;-) Ten post edytował dag 3.07.2005, 12:50:41 -------------------- |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Problem z kropką i __toString() to znany bug php.
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
To jest raczej feature, ale nadal bardzo uciazliwy
![]() Cytat It is worth noting that the __toString method will only be called when it is directly combined with echo() or print(). --Manual Cytat Ciekawi mnie kwestia kropki i przecinka. Gdy jest kropka php nie wykonuje metody __toString(), a gdy przecinek wykonuje. Gdy zastosujemy przecinek to czy Przy echo, gdy rozdzielasz argumenty (echo to nie funkcja) przecinkiem, kazdy z argumentow jest wypisywany osobno -- __toString() zadziala, a przy laczeniu stringow kropka __toStrint() nie jest uruchamiane. -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Taaaaak... this is not a bug, this is a feature. To nic, że kompletnie bez sensu, ale przecież "feature" brzmi dumnie
![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 3.07.2025 - 10:16 |