Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] programowanie obiektowe - gdzie go używać?
Forum PHP.pl > Forum > Przedszkole
sweter
Witam, 

od kilku dni uczę się programowania obiektowego i chyba dobrze mi to idzie smile.gif

Mam tylko problem, bo nie wiem gdzie stosować takie programowanie, a gdzie lepiej jest pisać "tradycyjnie" 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ść smile.gif

Z góry dziękuję za uwagi i rady smile.gif



taktu
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'.
sweter
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??
Wicepsik
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?
sweter
Hej, napisałem coś w OOP smile.gif
Moglibyście rzucić okiem i powiedzieć czy wszystko jest OK?
Moje klasy są niezwykle skomplikowane 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`");
darko
Zamiast niepotrzebnie opakowywać standardowe funkcje mysql - skorzystaj z PDO.
skowron-line
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 smile.gif
darko
Cytat(skowron-line @ 29.12.2009, 17:57:35 ) *
Większość osób zaczyna od napisania klasy do obsługi Mysql 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.
erix
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.
sweter
Czyli nie znaleźliście błędów? Uff.. 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 smile.gif
Mephistofeles
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 smile.gif.

Co do twojego pytania, to właśnie do tego służy konstruktor.
darko
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.
sweter
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 sad.gif
darko
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ę.
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.