Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pytanie o konstruktor
SzybkiKazik
post 15.10.2010, 19:28:00
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 2.08.2010

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


Witam,

Mam pytanie o różnice między takimi dwoma rozwiązaniami, chodzi o konstruktory.

Rozwiązanie 1

  1. class Osoba {
  2.  
  3. private $imie;
  4. private $nazwisko;
  5. private $www;
  6. private $email;
  7. private $telefon;
  8.  
  9. function __construct($imie, $nazwisko, $www, $email, $telefon){
  10.  
  11. $this->imie = $imie;
  12. $this->nazwisko = $nazwisko;
  13. $this->www = $www;
  14. $this->email = $email;
  15. $this->telefon = $telefon;
  16.  
  17. }
  18.  
  19. function dodajOsobe($imie, $nazwisko, $www, $email, $telefon) {
  20.  
  21. $db = new Database();
  22. $db -> DBConnect(HOSTNAME, USERNAME, PASSWORD, DB);
  23. $db -> DBQuery('INSERT INTO osoba SET
  24. imie=\''.$imie.'\',
  25. nazwisko=\''.$nazwisko.'\',
  26. www=\''.$www.'\',
  27. email=\''.$email.'\',
  28. telefon=\''.$telefon.'\';');
  29.  
  30. $db -> DBClose();
  31. }
  32.  
  33. }


W tym wypadku jeżeli mamy konstruktor to aby utworzyć obiekt trzeba zrobić tak:

  1. $imie = "Jan";
  2. $nazwisko = "Testowy";
  3. $www = "http://www.test.pl";
  4. $email = "osoba@test.pl";
  5. $telefon = "666777888";
  6.  
  7. $dodaj_osoba = new Osoba($imie, $nazwisko, $www, $email, $telefon);
  8. $dodaj_osoba -> dodajOsobe($imie, $nazwisko, $www, $email, $telefon);


Rozwiązanie 2

  1. class Osoba {
  2.  
  3. function dodajOsobe($imie, $nazwisko, $www, $email, $telefon) {
  4.  
  5. $this->imie = $imie;
  6. $this->nazwisko = $nazwisko;
  7. $this->www = $www;
  8. $this->email = $email;
  9. $this->telefon = $telefon;
  10.  
  11. $db = new Database();
  12. $db -> DBConnect(HOSTNAME, USERNAME, PASSWORD, DB);
  13. $db -> DBQuery('INSERT INTO osoba SET
  14. imie=\''.$imie.'\',
  15. nazwisko=\''.$nazwisko.'\',
  16. www=\''.$www.'\',
  17. email=\''.$email.'\',
  18. telefon=\''.$telefon.'\';');
  19.  
  20. $db -> DBClose();
  21. }
  22.  
  23. }


Tworzymy obiekt:

  1. $imie = "Jan";
  2. $nazwisko = "Testowy";
  3. $www = "http://www.test.pl";
  4. $email = "osoba@test.pl";
  5. $telefon = "666777888";
  6.  
  7. $dodaj_osoba = new Osoba();
  8. $dodaj_osoba -> dodajOsobe($imie, $nazwisko, $www, $email, $telefon);


Moje pytania są następujące:

1. Które rozwiązanie jest bardziej poprawne?
2. Jaka jest różnica między tymi dwoma rozwiązaniami?

Będę bardzo wdzięczny jeżeli ktoś znajdzie chwilkę na wytłumaczenie mi różnic i poprawności rozwiązania.

Z góry bardzo dziękuję i pozdrawiam.
Kazik.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
skowron-line
post 15.10.2010, 20:05:43
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Oba rozwiązania są. kiepskie.
w konstruktorze zrób połączenie z bazą, a w destruktorze rozłącz się z bazą.
Krótko i na temat.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
SzybkiKazik
post 15.10.2010, 20:16:52
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 2.08.2010

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


Cytat(skowron-line @ 15.10.2010, 20:05:43 ) *
Oba rozwiązania są. kiepskie.
w konstruktorze zrób połączenie z bazą, a w destruktorze rozłącz się z bazą.
Krótko i na temat.



To ja chyba nie bardzo rozumiem po co jest konstruktor, jeżeli ma być w nim tylko połączenie z bazą.
Wiem, że to pytanie jest banalne, ale czy możesz mi to wytłumaczyć łopatologiczne?

Dziękuję,
Kazik.
Go to the top of the page
+Quote Post
Spawnm
post 15.10.2010, 20:20:07
Post #4





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Konstruktor jest po to abyś zadeklarował coś co będzie wykorzystywane w wszystkich/większości metodach
czyli deklarujesz w nim np. $this->db=new database();
i w metodach typu add(), delete(), get() odnosisz się do $this->db zamiast robić 3 razy $db=new database();
Go to the top of the page
+Quote Post
SzybkiKazik
post 15.10.2010, 20:26:03
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 2.08.2010

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


W sumie ma to sens winksmiley.jpg

Dziękuję za pomoc.

Pozdrawiam,
Kazik.
Go to the top of the page
+Quote Post
starach
post 15.10.2010, 21:33:54
Post #6





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


http://en.wikipedia.org/wiki/Fluent_interface
  1. <?php
  2. class Osoba
  3. {
  4. private $imie;
  5. private $nazwisko;
  6. private $www;
  7.  
  8. public function getImie() { return $this->imie; }
  9. public function getNazwisko() { return $this->nazwisko; }
  10. public function getWww() { return $this->www; }
  11.  
  12. public function setImie($imie) { $this->imie = $imie; return $this; }
  13. public function setNazwisko($nazwisko) { $this->nazwisko = $nazwisko; return $this; }
  14. public function setWww($www) { $this->www = $www; return $this; }
  15. }
  16.  
  17. $osoba = new Osoba();
  18. $osoba->setImie('Jan')->setNazwisko('Kowalski')->setWww('www.JanKowalski.pl');
  19.  
  20. $osoba->setImie('Jan')
  21. ->setNazwisko('Kowalski')
  22. ->setWww('www.JanKowalski.pl');
  23. ?>
Go to the top of the page
+Quote Post
plurr
post 15.10.2010, 22:46:26
Post #7





Grupa: Zarejestrowani
Postów: 175
Pomógł: 12
Dołączył: 28.06.2007
Skąd: Bytom

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


oraz do tego co już napisał starach:

  1.  
  2. class OsobaService
  3. {
  4. // metody laczace z db itp
  5.  
  6. public function save(Osoba $osoba)
  7. {
  8. // dodaj do obiektu osoba ID
  9. // sprawdzaj czy obiekt $osoba posiada ID - sprawdzaj czy obiekt istnieje w bazie.
  10. // jesli obiekt istnieje to rob update, w przeciwnym wypadku insert
  11. }
  12. }
  13.  
  14. $osoba = new Osoba();
  15. $osoba->setImie('Jan')
  16. ->setNazwisko('Kowalski')
  17. ->setWww('www.JanKowalski.pl');
  18.  
  19. $osobaService = new OsobaService();
  20. $osobaService->save($osoba);
  21.  


--------------------
Wyobraźnia bez wiedzy może stworzyć rzeczy piękne.
Wiedza bez wyobraźni najwyżej doskonałe.

Albert Einstein
Go to the top of the page
+Quote Post
Crozin
post 16.10.2010, 13:47:24
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Konstruktor jest po to abyś zadeklarował coś co będzie wykorzystywane w wszystkich/większości metodach
Nie, nie od tego jest (patrz pkt 1).

1. Do konstruktorów przekazujemy tylko i wyłącznie dane potrzebne do działania obiektu. W przypadku takiego obiektu jak Osoba takie dane jak adres email czy strona www nie są potrzebne do jego działania. Ba! Imię i nazwisko nie jest potrzebne.
2. Jeden obiekt, jedno zadanie: ten obiekt ma reprezentować jakąś osobę, więc niech zajmuje się tylko tym. Takie rzeczy jak zapisywanie danych w bazie danych na podstawie tego obiektu pozostaw innym obiektom (patrz: post @plurr-a). Osobiście uważam, że ActiveRecord (czyli to co zaimplementowałeś) nie jest zbyt dobrym podejściem.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:15