Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] programowanie obiektowe - gdzie go używać?
sweter
post
Post #1





Grupa: Zarejestrowani
Postów: 623
Pomógł: 11
Dołączył: 1.01.2009
Skąd: Wrocław

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


Witam, 

od kilku dni uczę się programowania obiektowego i chyba dobrze mi to idzie (IMG:style_emoticons/default/smile.gif)

Mam tylko problem, bo nie wiem gdzie stosować takie programowanie, a gdzie lepiej jest pisać "tradycyjnie" (IMG:style_emoticons/default/sad.gif)

Powiedzmy, że mamy taką klasę służącą do tworzenia formularzy i w niej dwie metody:

  1.  
  2. class formularze{
  3.  
  4.    public $nazwa;
  5.  
  6.    public $wartosc;
  7.  
  8.    public function text(){
  9.  
  10.         echo "<input type=\"text\" name=\"".$this->name."\" value=\"".$this->wartosc."\">";
  11.  
  12.    }
  13.  
  14.    public function password(){        echo "<input type=\"password\" name=\"".$this->name."\" value=\"".$this->wartosc."\">";
  15.  
  16.    }
  17.  
  18.  
  19.  
  20. }
  21.  


W zależności od zapotrzebowania wyświetlało by się:

  1.  
  2. $cos = new formularze;
  3.  
  4. $cos -> nazwa = 'Nazwa_pola';
  5.  
  6. $cos -> wartosc = 'Wartość_pola';
  7.  
  8. $cos -> text();
  9.  


lub

  1.  
  2. $cos = new formularze;
  3.  
  4. $cos -> nazwa = 'Nazwa_pola';
  5.  
  6. $cos -> wartosc = 'Wartość_pola';
  7.  
  8. $cos -> password();
  9.  


Czy dobrze rozumiem? Programowaniem obiektowym zajmują się od niedawna więc proszę o wyrozumiałość (IMG:style_emoticons/default/smile.gif)

Z góry dziękuję za uwagi i rady (IMG:style_emoticons/default/smile.gif)



Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
taktu
post
Post #2





Grupa: Zarejestrowani
Postów: 89
Pomógł: 7
Dołączył: 19.05.2008

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


przede wszystkim używaj return w metodach zamiast echo, teraz pomyśl czy nie lepiej zrobić metodę input zamiast password i text?

  1. //i wywołać w ten sposób
  2.  
  3. echo $cos->input('password');
  4. echo $cos->input('text');
  5.  


Jeżeli nauczysz się dobrze OOP to już nie będziesz chciał pisać 'tradycyjnie'.
Go to the top of the page
+Quote Post
sweter
post
Post #3





Grupa: Zarejestrowani
Postów: 623
Pomógł: 11
Dołączył: 1.01.2009
Skąd: Wrocław

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


OK, dzięki.
Jeszcze takie mam pytanie: tworzę CMS'a (takiego prościutkiego) i na pewno będą w nim takie elementy jak popup'y z komunikatami oraz menu rozwijalne.
Czy powinienem zrobić te elementy za pomocą obiektów??
Go to the top of the page
+Quote Post
Wicepsik
post
Post #4





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

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


A nie lepiej zrobić coś takiego?

  1. class formularze{
  2. public function input($type, $name, $value=false){
  3. return '<input type="'.$type.'" name="'.$name.'" value="'.$value.'">';
  4. }
  5. }
  6.  
  7. $cos = new formularze;
  8. echo $cos->input('text', 'login', 'podaj login');
  9. echo $cos->input('password', 'haslo');


Nie znam się dobrze na oop, ale czy ten kod jest lepszy?

Ten post edytował Wicepsik 27.12.2009, 18:28:32
Go to the top of the page
+Quote Post
sweter
post
Post #5





Grupa: Zarejestrowani
Postów: 623
Pomógł: 11
Dołączył: 1.01.2009
Skąd: Wrocław

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


Hej, napisałem coś w OOP (IMG:style_emoticons/default/smile.gif)
Moglibyście rzucić okiem i powiedzieć czy wszystko jest OK?
Moje klasy są niezwykle skomplikowane (IMG:style_emoticons/default/tongue.gif)
Pierwsza łączy się z bazą danych, a druga liczy ilość rekordów z podanego zapytania:
  1. class db {
  2. private $host="localhost";
  3. private $db = "cms";
  4. private $db_login = "root";
  5. private $db_password = "";
  6.  
  7. public function __construct(){
  8. if(!$con=mysql_connect($this -> host, $this -> db_login, $this -> db_password)){
  9. echo "Nie udało się nawiązać połączenia z bazą danych";
  10. }
  11. if(!mysql_select_db($this-> db)){
  12. echo "Nie udało się wybrać bazy danych";
  13. }
  14. }
  15. }
  16.  
  17. class query extends db{
  18. public function query2($zap){
  19. $wyn = mysql_query($zap);
  20. return mysql_num_rows($wyn);
  21. }
  22. }
  23.  
  24. $o = new query;
  25. $o -> query2("SELECT * FROM `articles`");
Go to the top of the page
+Quote Post
darko
post
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Zamiast niepotrzebnie opakowywać standardowe funkcje mysql - skorzystaj z PDO.
Go to the top of the page
+Quote Post
skowron-line
post
Post #7





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

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


Cytat(darko @ 29.12.2009, 17:53:44 ) *
Zamiast niepotrzebnie opakowywać standardowe funkcje mysql - skorzystaj z PDO.


Większość osób zaczyna od napisania klasy do obsługi Mysql (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
darko
post
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat(skowron-line @ 29.12.2009, 17:57:35 ) *
Większość osób zaczyna od napisania klasy do obsługi Mysql (IMG:style_emoticons/default/smile.gif)

Dokładnie, sam też tak zaczynałem, jednak z perspektywy czasu oceniam, że niepotrzebnie i sporo mojej ówczesnej pracy poszło na marne. Lepiej "pobawić się" dziedziczeniem, zasięgiem zmiennych, nadpisywaniem metod itd. próbując pisać coś pożytecznego, co pozwoli uniknąć klepania kilka razy tego samego kodu.
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Nie do końca się zgodzę - jeśli chodzi o wydajność, to - niestety - PDO jest na szarym końcu. Używam, kiedy muszę coś MAŁEGO i szybko napisać.

A opakowanie standardowych funkcji się przydaje, chociażby dla obiektowości. Fakt, jest jeszcze mysqli, ale doradzanie PDO w środowisku, w którym będzie wykorzystywany tylko MySQL, to dla mnie nieporozumienie.

Poszukaj benchmarków na Sieci; nie wszystko złoto, co się świeci. A jeśli chodzi o np. bindowanie zapytań - mysqli. Choć nie zawsze bindowanie zapytań jest szybsze niż wstrzyknięcie całego zapytania; wszystko zależy od konkretnego przypadku.

~sweter - metoda query powinna być w klasie DB, a nie wyniku. Klasa wyniku, to - jak nazwa wskazuje - powinien być wynik + metody pozwalające na przeszukiwanie, wyciąganie danych, itp.
Go to the top of the page
+Quote Post
sweter
post
Post #10





Grupa: Zarejestrowani
Postów: 623
Pomógł: 11
Dołączył: 1.01.2009
Skąd: Wrocław

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


Czyli nie znaleźliście błędów? Uff.. (IMG:style_emoticons/default/smile.gif)
Teraz druga sprawa:
przeczytałem troszkę tutoriali i dowiedziałem się, że można zrobić taką metodę, która będzie się nazywała tak klasa i przy tworzeniu obiektów będzie się od razu wywoływać (tak chyba było w PHP 4). I nie chodzi tu o __construct!
Przykładowo:
  1. $obiekt = new NazwaKlasy(jakies_wartosci);

Możecie powiedzieć jak to zrobić w PHP 5, bo nie chce mi się przekopywać tych wszystkich tutoriali (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #11





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Może i PDO nie jest mistrzem wydajności, ale do takich zastosowań sprawdza się bardzo dobrze. A czy autor potrzebuje od razu maksymalnej wydajności? Niech się uczy przyszłościowych rozwiązań, a do odpowiedzi co jest lepsze dojdzie kiedyś sam (IMG:style_emoticons/default/smile.gif) .

Co do twojego pytania, to właśnie do tego służy konstruktor.

Ten post edytował Mephistofeles 29.12.2009, 18:15:22
Go to the top of the page
+Quote Post
darko
post
Post #12





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat
A opakowanie standardowych funkcji się przydaje, chociażby dla obiektowości.

Sztuka dla sztuki. Zresztą jak sam wspomniałeś jest obiektowe mysqli, jest PDO, są różne gotowe rozwiązania, nie bardzo widzę sens tworzenia kolejnych opakowywaczy dla standardowych funkcji mysql. Chyba że ktoś musi mieć koniecznie "po swojemu". A PDO polecam nie ze względów wydajnościowych, a dla świętego spokoju z sql injection.
Go to the top of the page
+Quote Post
sweter
post
Post #13





Grupa: Zarejestrowani
Postów: 623
Pomógł: 11
Dołączył: 1.01.2009
Skąd: Wrocław

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


OK, teraz mam coś takiego:
  1. class db {
  2. private $host="localhost";
  3. private $db = "cms";
  4. private $db_login = "root";
  5. private $db_password = "";
  6.  
  7. public function __construct(){
  8. if(!$con=mysql_connect($this -> host, $this -> db_login, $this -> db_password)){
  9. echo "Nie udało się nawiązać połączenia z bazą danych";
  10. }
  11. if(!mysql_select_db($this-> db)){
  12. echo "Nie udało się wybrać bazy danych";
  13. }
  14. }
  15.  
  16. public function query($zap){
  17. if($wyn = mysql_query($zap)){
  18. // wykonywanie zapytania
  19. echo "Znalazlem ".mysql_num_rows($wyn)." rozwiazan.<br />";
  20. global $wiersz;
  21. for($q=0; $q<mysql_num_rows($wyn); $q++){
  22. $wiersz[$q] = mysql_fetch_assoc($wyn);
  23. }
  24. }else{
  25. echo "Nie moge wykonac zapytania. MySQL zwraca blad: <i>".mysql_error()."</i>";
  26. }
  27. }
  28.  
  29. public function sort(){
  30. // wyświetlanie tablicy z rekordami
  31. echo "<pre>";
  32. print_r($wiersz);
  33. echo "</pre>";
  34. }
  35. }
  36.  
  37. $o = new db;
  38. $o -> query("SELECT id, title, date_and_time FROM `articles`");
  39. $o -> sort();
  40.  

Jednak wywołanie metody sort() nie wyświetla mi tablicy (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
darko
post
Post #14





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


W klasie db lepiej dodać pole protected $wiersz, w metodzie query wywal global $wiersz (na marginesie global działa na odwrót) i daj $this->wiersz[$q] = mysql_fetch_assoc($wyn); a w metodzie sort odwołać się: print_r($this->wiersz) zamiast print_r($wiersz). Unikaj globali w klasach bo rozwalasz hermetyzację.

Ten post edytował darko 29.12.2009, 19:13:54
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: 22.08.2025 - 14:06