Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obiektowość - problem
Forum PHP.pl > Forum > PHP > Object-oriented programming
DarekTychy
Witam,
temat z uwagi na poziom OOP powinien być w przedszkolu, ale wrzuciłem go do tego działu z racji na temat. W razie problemu proszę o przeklejenie tematu.

Postanowiłem nauczyć się programować obiektowo z racji na niską wydajność aplikacji proceduralnych ale już natrafiłem na problemy, których nie potrafię nigdzie doszukać rozwiązania. Pewnie wiecie, że dobrych materiałów o OO PHP po polsku jest bardzo mało, nie mówiąc już o praktycznych przykładach z życia wziętych (bardzo pomocne są przykłady na marchewkach i żarówkach, pozwalają zrozumieć obiektowość programowania... ironia oczywiście). Próbowałem prostych frameworków, ale dla obiektowego żółtodzioba jest tego trochę za dużo i nie wiadomo za co się zabrać - nie dla mnie póki co, a po drugie wole się sam nauczyć niż korzystać z gotowej klasy. Na takie lenistwo przyjdzie pora jak będę już bardziej zaawansowany w temacie smile.gif

Postanowiłem zacząć od napisania najprostszej klasy, czyli klasy do obsługi MYSQL. Wszystko spoko, metody działają, pobiera, zapisuje itp. Problem się zaczął gdy chciałem sobie zapisać w nowym obiekcie (obiektach? tablicy obiektów?) kategorie wraz z ich ID (dla zrozumienia: kategorie gier online, bo tego tyczy się mój projekt). No i zaczęły się schody, wszyło na jaw, że jenak dalej nie rozumiem istoty programowania obiektowego choć teorie potrafie recytować od tyłu...

Mógłbym prosić o pomoc, wyjaśnienie powyższego problemu, bądź odesłanie do POMOCNYCH oraz istotnych materiałów? Jak to ma w zasadzie wyglądać? Dla każdej kategorii nowy obiekt a w nim odpowiednie pola (jeśli tak, to jak tworzyć obiekty przy pobieraniu danych z bazy?) czy jeden obiekt a w nim kolejne czy obiekt z tablicą kategorii?

Będę wdzięczny za odpowiedzi, pozdrawiam!
thek
Gdyby ująć to najprościej... OOP to zamodelowanie tak rzeczywistości, by ujęła jej aspekty w możliwie uniwersalny sposób, z użyciem obiektów sprowadzonych do postaci elementarnie najmniej podzielnych ale i kompletnych. Inaczej mówiąc, muszą one spełniać określone zadania na tyle, by sens ich podziału na mniejsze jednostki był, z punktu widzenia logiki, bezsensowny. Obiekty te można łączyć w relacjach wzajemnych, wyciągać część wspólną (w postaci pewnych abstrakcyjnych struktur) lub wymagać określonych funkcjonalności (interfejsy). Weźmy na przykład owo połączenie MySQL...

Jest to jeden z dialektów SQL, więc powinien się wywodzić od klasy, która jest wspólna także dla innych dialektów. Gdyby iść dalej, można by nawet tę klasę uznać za jakąś formę formatu zapisu danych, bo przecież nie tylko MySQL można wykorzystywać, ale także wszelkiej maści urządzenia czy po prostu pliki różnego typu. Tym samym narzucamy od razu dwie funkcjonalności: odczyt i zapis danych. Tylko trzeba pamiętać, że nie wszystkie mają odczyt, zaś inne niekoniecznie mają możliwość zapisu wink.gif Poza tym skądś lub dokądś te operacje przebiegają. Dlatego dochodzi nam także konieczność nawiązywania i kończenia połączenia ze źródłem, a także sama opcja konfiguracji tegoż połączenia. Idźmy dalej... MySQL korzysta z zapytań SQL, które jakoś musimy tworzyć. Albo więc przyjmujemy je wprost, albo tworzymy z użyciem jakiegoś pomocnika.

Zaczynasz łapać? Kwestia logicznego myślenia i zauważania zależności to w zasadzie podstawa OOP w działaniu smile.gif
Kedan
Tak na szybko i z błędami:
  1. <?php
  2.  
  3. class GameObj {
  4.  
  5. public $id;
  6.  
  7. public $name;
  8.  
  9. public $whatever;
  10.  
  11. }
  12.  
  13. class SQL {
  14.  
  15. private $host;
  16.  
  17. private $database;
  18.  
  19. private $login;
  20.  
  21. private $password;
  22.  
  23.  
  24. protected $query;
  25.  
  26. protected $query_result;
  27.  
  28.  
  29. public __construct() {
  30. //....php
  31. }
  32.  
  33. public function table($table_name) {
  34. //...mysql
  35. $this->query = 'SELECT `$table_name`';
  36. return $this;
  37. }
  38.  
  39. public function id($id) {
  40. //....mysql
  41. $this->query .= 'WHERE `id` = $id';
  42. return $this;
  43. }
  44.  
  45. public function get() {
  46. $this->query_result = mysql_query($this->query)
  47. return new GameObj($this->query_result);
  48. }
  49.  
  50. public function save($object) {
  51. $errors = FALSE;
  52. //.... mysql + php
  53. return $errors ? FALSE : $object;
  54. }
  55.  
  56. }
  57.  
  58. // uzycie:
  59.  
  60. $sql = new SQL('localhost','database','login','password');
  61.  
  62. $obj = $sql
  63.  
  64. ->table('games')
  65.  
  66. ->id('11')
  67.  
  68. ->get();
  69.  
  70. $obj->name = 'Foo';
  71.  
  72. $obj = $sql->save($obj);
  73.  
  74. ?>

Zasadniczo im więcej klas utworzysz i im prostsze zadania będą wykonywać tym lepiej. Zazwyczaj do SQL nie wystarczy jedna klasa - chyba że będzie bardzo prosta. Poczytaj sobie o łańcuchowaniu (method chaining http://www.webnote.pl/method-chaining-w-php.html). Jak już bierzesz się za OOP w PHP to poczytaj o wzorcu MVC - Model View Controller - to takie trzy podstawowe klasy z których zbudowana jest reszta systemu: model odpowiada za komunikacje z bazą danych, view za wyświetlanie danych, controller za pobieranie danych od użytkownika, przekazywanie danych z modelu do widoku itd. I ucz się angielskiego.
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.