![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 163 Pomógł: 0 Dołączył: 10.09.2006 Ostrzeżenie: (0%)
|
mam klasę w której chciałbym mieć przeładowany konstruktor, i zastanawiam sie jak to zrobić. jeden wywoływany z jednym parametrem(tablica), a drugi z 6 zmiennymi. Nie wiem czy bawić się tu w zliczanie argumentów func_num_args, czy też funkcją __call() [tylko ie bardzo wiem jak ją zapisać]
|
|
|
|
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%)
|
Chyba chodzi ci o przeciążenie a nie przeładowanie (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Jak już pewnie wiesz w php nie da się tego zrobić po ludzku i trzeba się uciec do kombinowania, które zazwyczaj psuje czytelność kodu. Ja osobiście w większości takich przypadków używam osobnej meteody/metod statycznych, które są odpowiedzialne za tworzenie obiektu. Sam konstruktor zawsze przyjmuje określone parametry - najczęściej tablicę asocjacyjną. Oprócz tego istnieje osobna klasa z metodami static, która odpowiednio inicjuje obiekt w zależności od potrzeb czyli np. mam klasę produkt z konstruktorem
a do tego osobną klasę z metodami static takimi jak np:
itd itp. Nie wiem czy tak jest poprawnie, ale wydaje mi się to najbardziej przejrzystą metodą, która pozwala na łatwe rozszerzanie, gdyby w przyszłości okazało się, że potrzebuję innego sposobu na wywołanie obiektu. Oczywiście ten schemat stosuję tylko w wypadku skomplikowanych obiektów. W przypadku, gdy jest jakiś prosty obiekt i 2 warianty jego tworzenia - tj. z bazy lub z tablicy, stosuje coś jak ActiveRecord. Stworzyłem takie małe rozwiązanie oparte o ZF, gdzie mogę szybko definiować obiekty wskazując ich pola, i potem inicjować je przekazując listę wartości tych pól lub rekord odczytany z bazy. |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 163 Pomógł: 0 Dołączył: 10.09.2006 Ostrzeżenie: (0%)
|
Chyba chodzi ci o przeciążenie a nie przeładowanie (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) hmm, jak się uczyłem c++ to było przeładowanie nazw funkcji (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) no ale odnośnie sedna tematu, i mojego pomysłu, ale takie coś, chyba tez dobre rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
|
|
|
|
Post
#4
|
|
|
Grupa: Przyjaciele php.pl Postów: 384 Pomógł: 6 Dołączył: 11.09.2004 Skąd: Grodzisk Mazowiecki Ostrzeżenie: (0%)
|
Prawy górny róg. Google. Wpisujemy "przeciążenie metod". Ok 30 sek. otrzymujemy to czego chcemy:
http://forum.php.pl/index.php?showtopic=39685 Polecam Google. To naprawdę dobra wyszukiwarka. |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%)
|
hmm, jak się uczyłem c++ to było przeładowanie nazw funkcji (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) no ale odnośnie sedna tematu, i mojego pomysłu, ale takie coś, chyba tez dobre rozwiązanie (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Ten sposób jest oczywisty, ale moim zdaniem nie jest to zbyt dobre rozwiązanie. W ten sposób cofasz się do zapisów w stylu
A po miesiącu zastanawiasz się co robi funkcja foo i czym są jej argumenty itp itd. Rozwiązanie jest proste (sam je zresztą czasami stosuje (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ), ale komplikuje to strasznie kod - jak naprzykład teraz opisać interfejs takiej funkcji. Skoro $bar1 może być tablicą lub skalarem, $bar2 może istnieć lub nie itd itp) Oczywiście wszystko jest kwestią rozsądku i czasami nie warto się bawić w chodzenie na około tylko po to aby poprawić czytelność kodu... ale czasami warto (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
|
![]() ![]() |
|
Aktualny czas: 21.12.2025 - 11:51 |