Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przeciążenie konstruktora
Forum PHP.pl > Forum > PHP > Object-oriented programming
Aztech
Z tego co mi wiadomo nie można w 5 tworzyć przeciążeń. Ale czy kest jakiś sposób aby to obejść? Bardzo by mi zależało aby stworzyć takie 2 konstruktory

  1. <?php
  2.  
  3. #pierwszy konstruktor 
  4. public function __construktor($id) {
  5. /* kod */
  6. }
  7.  
  8. #drugi konstruktor
  9. public function __construktor($email, $nickname) {
  10. /* kod */
  11. }
  12.  
  13. ?>


Wpadłem na pomysł żeby zamiast tego zrobić 2 klasy z czego w drugiej piszę po prostu nowy konstruktor, ale to jest rozwiązanie tymczasowe i dla mnei niezbyt wygodne.
NuLL
  1. <?php
  2.  
  3. public function __construct($mData, $nickname='') 
  4. {
  5. if(is_int($mData))
  6. {
  7. //pierwszy konstruktor
  8. }elseif(isset($mData) && is_string($mData) && isset($nickname))
  9. {
  10. //drugi konstruktor
  11. }
  12. }
  13. ?>
ActivePlayer
  1. <?php
  2.  
  3.  
  4.  
  5. public function __construktor() {
  6. //i
  7. func_count_args();//chyba tak sie nazywa. i potem wg tego odpalasz odpowiedni. tylko tyle mi na mysl
     przychodzi
  8. /* kod */
  9. }
  10.  
  11. #pierwszy konstruktor 
  12. public function __construktor1($id) {
  13. /* kod */
  14. }
  15.  
  16. #drugi konstruktor
  17. public function __construktor2($email, $nickname) {
  18. /* kod */
  19. }
  20.  
  21.  
  22. ?>
mike
No ale po co Ci to?

Z nazw atrybutówj jakie podałeś wnioskuję że taki konstruktor miałby stworzyć w różnych przypadkach różne obiekty.
A skoro tak to powinny być dwie klasy. Tak siepowinno projektować.
NuLL
mike_mech - moze nie do konca. Ja mam pomysl czemu to moze sluzyc. To jest tylko przyklad.

Mamy abstrakcyjna klase typu genericObject ktora reprezentuje pojedynczy wiersz w tabeli. Reszta klas o podobnej wymowie dziedziczy po niej. Pierwsza wersja konstruktora tworzy obiekt ladujac jego dane z bazy i tam sobie na nim operujemy. Druga nie pobiera tylko przypisuje poszczegolne wlasnosci i po wykonaniu metody save() zapisuje nam te dane jako nowy wiersz i zwraca id sama stajac sie obiektem reprezentujacym nowo utworzony wiersz.
splatch
Ja rozwiązałem to mniej estetycznie, nie mniej - działa:
  1. <?php
  2. /**
  3.  * Konstroktor. 
  4.  * Dopuszczane wartości przekazywane do kontruktora
  5.  * <code>
  6.  * new ActionForward(array config)
  7.  * new ActionForward(string path) [redirect = true]
  8.  * new ActionForward(string path, bool redirect)
  9.  * new ActionForward(string module, string action) [redirect = false]
  10.  * new ActionForward(string module, string action, bool redirect)
  11.  * </code>
  12.  * 
  13.  * @param array
  14.  **/
  15. public function __construct($config = array()) {
  16. $data = func_get_args();
  17. $size = sizeof($data);
  18. if(is_array($data[0])) {
  19. $this->config = array_merge($this->config,$config);
  20. } elseif(is_string($data[0]) && $size == 1) {
  21. $this->config['path']  = $data[0];
  22. $this->config['redirect'] = true;
  23. } elseif(is_string($data[0]) && is_bool($data[1])) {
  24. $this->config['path']  = $data[0];
  25. $this->config['redirect'] = $data[1];
  26. } elseif(is_string($data[0]) && is_string($data[1])) {
  27. $this->config['module']  = $data[0];
  28. $this->config['action']  = $data[1];
  29. } elseif(is_string($data[0]) && is_string($data[1]) && is_bool($data[2])) {
  30. $this->config['module']  = $data[0];
  31. $this->config['action']  = $data[1];
  32. $this->config['redirect'] = $data[3];
  33. } else {
  34. throw InvalidArgumentException('ActionForward');
  35. }
  36. }
  37.  
  38. ?>
Aztech
@Null Trafiłeś w samo sedno! Dokładnie w tym celu chcę to wykorzystać! Idealnie odczytałeś moje intencje.

Chyba skorzystam z idei podanej przez Ciebie, chociarz rozwiązanie splatcha też mogę dostosować.
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.