Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP] Moduł strony www
Forum PHP.pl > Forum > PHP > Object-oriented programming
!mistrz
Witam wszystkich ludzi dobrej woli smile.gif Od jakiegoś czasu interesuję się programowaniem obiektowym w PHP, ale bez odpowiedzi na moje pytania oraz wątpliwości chyba nigdy tego nie zrozumiem. Dlatego właśnie postanowiłem napisać i zdać się na doświadczenie osób, które się tym zajmują na co dzień.

Pytania oprę na ostatnio realizowanym projekcie jakim był serwis www z grami flash. Jak to serwis można w nim wyróżnić pewne części/moduły takie jak: Najpopularniejsza gra, Ostatnio grana gra, Newsletter... No i tu pojawia się moje pierwsze pytanie. Czy taki każdy moduł powinien być osobną klasą, której obiekt będziemy tworzyć??

Drugie moje pytanie będzie dotyczyło konkretnego modułu, który odpowiedzialny jest za wyświetlanie wszystkich gier z bazy danych z określonej kategorii. Jak byście takie coś zorganizowali w sposób obiektowy?? Mógłby ktoś tak w skrócie przedstawić jakie własności powinna mieć klasa, jakie metody, oczywiście bez implementacji. Tak tylko, żebym mógł się zapoznać.

Ja zrobiłem coś takiego tyle, że mi się to niespecjalnie podoba:

Kod
class CatGames
           {
               private $data = array();
      
               function __construct($cat_name)
               {
                   global $db;
                  
                   $result = $db->query('SELECT name_id, name FROM games g
                                                 LEFT JOIN categories c ON g.cat_id=c.id
                                                 WHERE c.name=\''.$cat_name.'\'');
      
                   while($row = $result->fetch_assoc())
                   {
                       $row['url'] = getURL('gra',$row['name_id']);
                       $this->data[] = $row;
                   }
                  
                   $result->close();
               }
              
               function __get($var)
               {
                   return $this->$var;
               }
           }
          
           $catgames = new CatGames();
           $smarty->assign('catgames',$games->data);


Z góry dzięki z pomoc i pozdrawiam.
mecenas
ad 1
Tutaj nie będę odkrywczy i rzucę stwierdzeniem - wszystko zależy od Twojego stylu programowania. Niemniej tworzenie osobnych klas do każdej z tych kategorii to imho chybione rozwiązanie. Mi się od razu nasuwają dwa rozwiązania:
a) tworzysz główną klasę, która określa podstawowe parametry każdej z - nazwijmy to umownie - kategorie, a następnie możesz albo utworzyć klasę dziedziczącą te podstawowe atrybuty, albo - jeśli różnice są kosmetyczne - tworzyć po prostu obiekty tej samej klasy, które będą po prostu opisywały kolejne "moduły"
cool.gif jeśli są to przykładowo - po jednym elemencie do każdej kategorii, możesz stworzyć klasę wyszukującą i przechowującą te potrzebne Tobie akurat w tej chwili wartości.

Oczywiście są to tylko małe sugestie, faktem jest, że wariacji tych możliwości jest bez liku. Dlatego dobrze jest wiedzieć po co i dlaczego chce się użyć OOP w php, który jak wiadomo demonem prędkości nie jest...

ad 2 - tu właściwie mogę Cię odesłać do odpowiedzi na pytanie pierwsze... Tak naprawdę wszystko zależy od tego co właściwie chcesz osiągnąć, na jakie uogólnienie w obrębie całego kodu poszedłeś, czego potrzebuje przykładowo warstwa prezentacji.
Możliwości jest naprawdę wiele smile.gif
markac
Trudno tu coś doradzić. Za mało informacji. Tworzenie klas do każdej możliwej operacji uważam także za zły pomysł i radzę poczytać o OOP.
"Najpopularniejsza gra, Ostatnio grana gra" - można to upchać w jedną klasę i dwie metody, to chyba jasne?
Obiekt reprezentuje jakiś fizyczny byt, w tym przypadku grę. Trzecia metoda jaka bym dodał jest wyświetlenie gier z kategorii.
Przez moduł rozumiem zbiór operacji, który także dla mnie powinien być klasą (Newsletter).

A przykładowa klasa... hm, nie wiem czy to Ci teraz w czymś pomoże:
  1. <?php
  2. class Game {
  3.  public function getTopRankGame() { /*...*/ }
  4.  public function getLastPlayedGame() { /*...*/ }
  5.  public function getGamesFromCategory($categoryId) { /*...*/ }
  6. }
  7. ?>


Możesz wykorzystać adres URL w postaci np. www.adres.pl/index.php?modul=Game&akcja=getGamesFromCategory&id=30, gdzie moduł odpowiada nazwie klasy, akcja nazwie metody tej klasy. Id to parametr. Może być ich więcej, to zależy już od Ciebie.

Najprostsza postać wywołania metody obiektu może wyglądać tak:
  1. <?php
  2. $className = $_GET['modul'];
  3. $methodName = $_GET['akcja'];
  4. $params = isset($_GET['id']) ? array($_GET['id']): array(); // id kategorii
  5.  
  6. require_once($className . '.php');
  7. $game = new $className;
  8. $game->call_user_method_array($methodName, $className, $params);
  9. ?>
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.