Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [OOP] konstruktor ?
piraciq
post
Post #1





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


Witam,

Może to i nie miejsce na to, a może i tak? Takie pytanie teoretycznie:

Czy w konstruktorze klasy należy umieszczać wszystkie dane które trafiają do klasy czy tylko te które ulegają przetworzeniu przez tą klasę??

pozdrawiam
Go to the top of the page
+Quote Post
skowron-line
post
Post #2





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

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


Takie które trafiają do klasy przy tworzeniu obiektu.


--------------------
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
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Konstruktor klasy służy do skonstuowania obiektu. Co oznacza że powinieneś przekazać do niego tylko te dane, która są wymagane do powstania instancji.
Go to the top of the page
+Quote Post
piraciq
post
Post #4





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


dajmy na to przy rejestracji usera::


login haslo w zasadzie tyle wystarczy prawda questionmark.gif

ale jesli mamy w formularzu rejestracji inne pola questionmark.gif komunikator stronę www??
Go to the top of the page
+Quote Post
mike
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(piraciq @ 14.07.2008, 15:46:47 ) *
dajmy na to przy rejestracji usera::
login haslo w zasadzie tyle wystarczy prawda questionmark.gif
Źle.

Załóżmy że rejestrujesz za pomocą klasy User. Do stworzenia takiego obiektu wcale nie potrzebujesz hasła czy loginu.
Powinno byc raczej rak:
  1. <?php
  2.  
  3. /* @var $user User */
  4. $user = new User();
  5. $user->setName('użytkownik');
  6. $user->setPassword('hasło');
  7. $user->registerNewUser();
  8.  
  9. ?>
Go to the top of the page
+Quote Post
piraciq
post
Post #6





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


Cytat(mike @ 14.07.2008, 16:00:50 ) *
Źle.

Załóżmy że rejestrujesz za pomocą klasy User. Do stworzenia takiego obiektu wcale nie potrzebujesz hasła czy loginu.
Powinno byc raczej rak:
  1. <?php
  2.  
  3. /* @var $user User */
  4. $user = new User();
  5. $user->setName('użytkownik');
  6. $user->setPassword('hasło');
  7. $user->registerNewUser();
  8.  
  9. ?>

chodzi mi o sam konstruktor klasy "user" co w takim przypadku powinno sie w nim znajdować bo z tego co Ty napisałeś domyślam się, że w konstruktorze się nic nie znajduje tak questionmark.gif

  1. <?php
  2. public function __construct
  3. {}
  4. ?>
Go to the top of the page
+Quote Post
mike
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


W podanym przez Ciebie przykładzie tak, konstruktor byłby pusty. Ale to wszystko zależy czym u Ciebie jest User i jak działa.
Wystarczy przykład lekko zmodyfikować i masz konstruktor wypełniony.
  1. <?php
  2.  
  3. class User {
  4. private $name;
  5. private $password;
  6. private $gg;
  7. // ... etc
  8.  
  9. public function __construct($id = null) {
  10. if ($id !== null) {
  11. $user = User::retrieveById($id);
  12. $this->fillUser($user);
  13. }
  14. }
  15.  
  16. public static function retrieveById($id) {
  17. // funkcja pobiera z bazy danych użytkownika i zwraca go jako obiekt
  18. }
  19.  
  20. public function fillUser(User $user) {
  21. // funkcja wypełnia pola obiektu polami z przekazanego obiektu;
  22. }
  23.  
  24. }
  25.  
  26. ?>

I teraz możesz zrobić:
  1. <?php
  2.  
  3. // nowy użytkownik
  4. $newUser = new User();
  5.  
  6. // pobranie istniejącego użytkownika
  7. $existingUser = new User(12);
  8. // wykonanie poyższego konstruktowa byłoby tym samym co:
  9. $existingUser = User::retrieveById(12);
  10. // ale to w końcu przykład
  11.  
  12. ?>



Jak widzisz do konstruktora przekazuje się to co jest potrzebne a nie tyle ile się da. Czasem oczywiście do stworzenia obiektu nic nie jest potrzebne.
Wtedy konstruktor nic nie robi. i może być pusty lub w ogóle może go nie być.
Go to the top of the page
+Quote Post
piraciq
post
Post #8





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


Dzięki za nakierowanie mnie :]

jeśli napotkam na jakieś pytania napiszę jeszcze raz dzieki
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #9





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


To co podał mike jest ładnym przykładem (sam bym podał gdybym był wcześniej, ach ten Propel tongue.gif), ale ogólnie zasiada jest taka, że projektujesz sobie jakiś obiekt, i wiesz że nie może on zacząć działać bez pewnych danych, więc aby wymusić aby zawsze były, przyjmujesz w konstruktorze.
Tak jak masz definicję klasy obsługującej jedno połączenie, to wiadomo, że potrzebne jest do czego się łączy (czy to soap czy pdt ), oczywiście można dać metodę która to ustawia, ale przez to zawsze musiał byś sprawdzać czy już zostało podane, czy jeszcze nie. Ale jest zasada, konstruktor (jak i każda metoda) muszą być jak najprostsze, czyli jak już coś przyjmujesz, to staraj się jak najmniej, tyle ile jest niezbędne.

Ten post edytował Sedziwoj 14.07.2008, 20:32:39


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
piraciq
post
Post #10





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


W przypadku klas do obsługi baz danych to jest dla mnie zrozumiałe co się znajduje w konstruktorze klasy. Ale właśnie mam problem ze zrozumieniem tej filozofii kiedy przekazywać dane do konstruktora a kiedy nie?? Jest na to jakaś reguła czy nie questionmark.gif
Go to the top of the page
+Quote Post
mike
post
Post #11





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Jest reguła. Powtórzę: przekazujesz to co jest niezbędne.
A niewiele rzeczy jest niezbędnych, więc staraj się być minimalistą w tym zagadnieniu.
Go to the top of the page
+Quote Post
piraciq
post
Post #12





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


No to zobaczymy co mi z tego wyjdzie :]

  1. <?php
  2. class register extends sql
  3. {
  4.  
  5.  
  6. public function __construct($email,$pass,$pass_replace,$nick,$minlenghtpass)
  7. {
  8. $this->user_email=trim($email);
  9. $this->user_pass=trim($pass);
  10. $this->user_pass_replace=trim($pass_replace);
  11. $this->user_nick=trim($nick);
  12. $this->minlenghtpass=$minlenghtpass;
  13. }
  14. private function licz_wiersze($query)
  15. {
  16. return mysql_num_rows($query);
  17. }
  18. public function sprawdz_email_w_bazie($email)
  19. {
  20.  
  21. $zap=$this->query("select user_email from users where user_email='".$this->user_email."'");
  22. return $this->licz_wiersze($zap);
  23.  
  24. }
  25.  
  26. public function poprawnosc_email ($email)
  27. {
  28. if (eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$",$email))
  29. {
  30. return true;
  31. }
  32. else
  33. {
  34. return false;
  35. }
  36.  
  37. }
  38. public function dlugosc_hasla ($pass)
  39. {
  40. if (strlen($pass)<=$this->minlenghtpass)
  41. {
  42. return false;
  43. }
  44. else
  45. {
  46. return true;
  47. }
  48. }
  49. public function sprawdzanie_hasla($pass,$pass_replace)
  50. {
  51.  return ($this->user_pass==$this->user_pass_replace ? true : false )
  52.  
  53. }
  54.  
  55. }
  56.  
  57. $register= new register($_POST['email'],$_POST['pass'],$_POST['pass_replace'],$_POST['nick'],'5');
  58. ?>


i czy tu jest za dużo zmiennych przekazywanych do konstruktora questionmark.gif

Ten post edytował piraciq 17.07.2008, 14:13:15
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #13





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Nie, może być tak, choć ja bym się zastanowił nad przekazaniem tablicy zamiast osobnych argumentów.
Taka rejestracja ma charakter potencjalnie zmienny, więc array byłby na pewno lepszy smile.gif

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
wlamywacz
post
Post #14





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


Łatwiej chyba takie coś:
  1. <?php
  2. public function setParam($name, $param) {
  3.  
  4. $this->$name = $param;
  5. }
  6.  
  7. $db = new db;
  8. $db->setParam('user', $ini_array['mysql']['user']);
  9. $db->setParam('pass', $ini_array['mysql']['pass']);
  10. $db->setParam('name', $ini_array['mysql']['name']);
  11. $db->setParam('host', $ini_array['mysql']['host']);
  12. $db->connect();
  13. ?>


Poza tym nie rozumiem czemu dziedziczysz klasę odpowiedzialną za bazę danych ?

Ten post edytował wlamywacz 17.07.2008, 19:24:04
Go to the top of the page
+Quote Post
Sedziwoj
post
Post #15





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@piraciq
Pomijam konstruktor, bo jak patrzę na takie coś, to się zastanawiam po co ten obiekt, chyba tylko aby był.
Przecież jak tworzysz obiekt, to po to aby ułatwić sobie życie, a to co prezentujesz, to zebranie funkcji i zmiennych w jedno pudełko.
Co do propozycji tablicy, to moim zdaniem jest to nie eleganckie, wiadomo jak obiekt obrabia dane z POST/GET to ma tablice, ale dalej dane o konkretnej strukturze, powinny być inaczej rozpowszechniane. Czy to przez obiekt danych (w tym przypadku, nadmiar formy, nad treścią), czy też po prostu przekazywane pojedynczo przez set'ery. A taki obiekt rejestracji jak dostaje te dane to od razu je sprawdza, czy są poprawne, nie ktoś kto go używa ma sam "uruchamiać" sprawdzanie.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #16





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Może i tablica do konstruktora to nie najlepszy pomysł, ale już tablica przez setter wydaje mi się sensowna. Sprawdzasz wtedy strukturę takiej tablicy i masz wszystko w jednym miejscu. Troszkę jak propelowe fromArray() przy wypełnianiu obiektu. Uważam, że zwłaszcza przy obiektach, które nie są udostępniane użytkownikowi jako interfejs, takie coś doskonale przyspiesza. Można się też pokusić o specjalny obiekt zamiast tablicy - Parameters smile.gif
heh, tylko po co tutaj...


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
piraciq
post
Post #17





Grupa: Zarejestrowani
Postów: 174
Pomógł: 4
Dołączył: 27.07.2007
Skąd: Kraków

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


Cytat(wlamywacz @ 17.07.2008, 20:22:01 ) *
Łatwiej chyba takie coś:
  1. <?php
  2. public function setParam($name, $param) {
  3.  
  4. $this->$name = $param;
  5. }
  6.  
  7. $db = new db;
  8. $db->setParam('user', $ini_array['mysql']['user']);
  9. $db->setParam('pass', $ini_array['mysql']['pass']);
  10. $db->setParam('name', $ini_array['mysql']['name']);
  11. $db->setParam('host', $ini_array['mysql']['host']);
  12. $db->connect();
  13. ?>


Poza tym nie rozumiem czemu dziedziczysz klasę odpowiedzialną za bazę danych ?

to był przykład książkowy dziedziczenie klas, każde wskazówki są mile widziane :]
dzięki

opierałem się na tym
Go to the top of the page
+Quote Post
Neojawor
post
Post #18





Grupa: Zarejestrowani
Postów: 106
Pomógł: 1
Dołączył: 2.12.2005
Skąd: Jaworzno

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


może trochę się czepiam i nie na temat, ale masz kod:
  1. <?php
  2. private function licz_wiersze($query)
  3.    {
  4.        return mysql_num_rows($query);
  5.    }
  6. ?>

wszystko w nim dobrze, ale mysql_num_rows wymaga jako parametru wyniku zapytania, a parametr $query sugeruje, że będziesz chciał tam wsadzić treść zapytania.

Wracając do tematu, to register nie pasuje mi na klasę. Klasa ma być opisem jakiejś rzeczywistej rzeczy, a register to czynność. IMHO bardziej pasuje tu stworzenie klasy user, który będzie miał metodę register dodającą obiekt tej klasy do bazy.
Go to the top of the page
+Quote Post
mecenas
post
Post #19





Grupa: Zarejestrowani
Postów: 80
Pomógł: 5
Dołączył: 23.09.2008
Skąd: Chełmno/Toruń

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


w kwestii konstruktora - jest to kwintesencja OOP i w zasadzie bez tego nie można mówić o obiektowości.
Jaki jest sens konstruktora w oderwaniu od baz danych? Ma dokładnie takie samo znaczenie. W razie poważniejszych problemów ze zrozumieniem tego polecam lekturę teorii innych języków obiektowych - być może wyjście z poletka php ułatwi zadanie, a przecież w wielkim stopniu język jest sprawą wtórną smile.gif

btw - witam smile.gif


--------------------
-- http://rafaljakubowski.net76.net --
google's my life ;)
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #20





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Również witam smile.gif

Cytat
w kwestii konstruktora - jest to kwintesencja OOP i w zasadzie bez tego nie można mówić o obiektowości.

Czyli jak nie ma konstruktora, to nie ma OOP? Wybacz, ale jestem w stanie napisać kod w pełni obiektowy bez użycia choćby jednego konstruktora, więc dziwne masz to kryterium obiektowości.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 20.08.2025 - 04:27