Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak przeładować konstruktor
Forum PHP.pl > Forum > PHP > Object-oriented programming
enigma
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ć]
athabus
Chyba chodzi ci o przeciążenie a nie przeładowanie 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.
enigma
Cytat(athabus @ 27.02.2007, 23:17:39 ) *
Chyba chodzi ci o przeciążenie a nie przeładowanie tongue.gif
hmm, jak się uczyłem c++ to było przeładowanie nazw funkcji tongue.gif

no ale odnośnie sedna tematu, i mojego pomysłu, ale takie coś, chyba tez dobre rozwiązanie 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. ?>
Strzałek
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.
athabus
Cytat(enigma @ 28.02.2007, 21:30:55 ) *
hmm, jak się uczyłem c++ to było przeładowanie nazw funkcji tongue.gif

no ale odnośnie sedna tematu, i mojego pomysłu, ale takie coś, chyba tez dobre rozwiązanie 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 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 biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.