Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> jak przeładować konstruktor
enigma
post
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ć]
Go to the top of the page
+Quote Post
athabus
post
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

  1. <?php
  2. __construct($paramsArray)
  3. ?>


a do tego osobną klasę z metodami static takimi jak np:

  1. <?php
  2. public static function getById($intId)
  3. {
  4. //np. odczytanie parametrów z bazy i wywolanie konstruktora
  5. }
  6. ?>

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.
Go to the top of the page
+Quote Post
enigma
post
Post #3





Grupa: Zarejestrowani
Postów: 163
Pomógł: 0
Dołączył: 10.09.2006

Ostrzeżenie: (0%)
-----


Cytat(athabus @ 27.02.2007, 23:17:39 ) *
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)

  1. <?php
  2. function __construct() 
  3. {
  4. $zIleParametrów = func_num_args();
  5.  
  6. if($zIleParametrów == 1)
  7. {
  8. //coś tam
  9. }
  10. else if($zIleParametrów == 6)
  11. {
  12. //coś tam
  13. }
  14. }
  15. ?>
Go to the top of the page
+Quote Post
Strzałek
post
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.
Go to the top of the page
+Quote Post
athabus
post
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Cytat(enigma @ 28.02.2007, 21:30:55 ) *
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)

  1. <?php
  2. function __construct() 
  3. {
  4. $zIleParametrów = func_num_args();
  5.  
  6. if($zIleParametrów == 1)
  7. {
  8. //coś tam
  9. }
  10. else if($zIleParametrów == 6)
  11. {
  12. //coś tam
  13. }
  14. }
  15. ?>


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

  1. <?php
  2. function foo($bar1, $bar2, $bar3)
  3. {
  4. return $bar1 * $bar2 + $bar3;
  5. }
  6. ?>


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)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.12.2025 - 11:51