Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][Smarty] Produkt w sklepie internetowym
Forum PHP.pl > Forum > PHP > Object-oriented programming
jasinskiwojciech
Witam,
Chcę wyświetlić w sklepie informacje o produkcie. Mam moduł, który pobiera informacje o danym produkcie i przekazuje obiekt Produkt do Smarty.
W skrócie wygląda to tak:

pokazProdukt.php
  1. <?php
  2. $produkt = new Produkt(1);
  3. $produkt->PobierzZdjecia();
  4.  
  5. $smarty->assign("produkt", $produkt);
  6. ?>


Produkt.class.php
  1. <?php
  2. class Produkt
  3. {
  4.    public
  5.    $id = 0,
  6.    $nazwa = "",
  7.    $cena = 0,
  8.    ...
  9.    $idDodajacego = 0, // id uzytkownika, który dodal produkt - pobrany z bazy
  10.    $dodajacy = null, // obiekt Uzytkownik
  11.    $zdjecia = null; // obiekt Zdjecia
  12.    
  13.    function __construct($id)
  14.    {
  15.        // pobieranie z bazy produktu i ustawianie wartości
  16.        // np. $this->id = $r['id']; itp.
  17.        
  18.        // po pobraniu idDodającego z bazy tworzony jest obiekt Uzytkownik
  19.        $this->Dodajacy = new Uzytkownik($this->idDodajacego); // konstruktor Uzytkownika działa na tej samej zasadzie co w Produkt
  20.    }
  21.    
  22.    public function PobierzZdjecia()
  23.    {
  24.        $this->zdjecia = new Zdjecia($this->id); // pobieranie wszystkich zdjęć należących do tego produktu
  25.    }
  26.  
  27. }
  28. ?>


Zdjecia.class.php
  1. <?php
  2. class Zdjecia
  3. {
  4.    public lista = array();
  5.    
  6.    function __construct($id)
  7.    {
  8.        // pobieranie wszystkich zdjec do produktu o podanym ID i dodawanie zdjec do $this->lista
  9.        $q = mysql_query(....);
  10.        while ($r=mysql_fetch_assoc($q))
  11.        {
  12.            $this->lista[] = new Zdjecie($r);
  13.        }
  14.    }
  15. }
  16. ?>


Zdjecie.class.php
  1. <?php
  2. class Zdjecie
  3. {
  4.    public
  5.    $id,
  6.    $nazwaPliku,
  7.    .....
  8.    $idDodajacego,
  9.    $dodajacy;
  10.    
  11.    function __construct($dane)
  12.    {
  13.        // ustawianie wartosci zmiennych $id, $nazwapliku itp na podstawie tablicy $dane
  14.        // np. $this->id = $dane['id']; itp.
  15.        
  16.        // tak samo jak przy produkcie mamy idUzytkownika, który dodał dane zdjęcie i pobieramy jego dane
  17.        $this->dodajacy = new Uzytkownik($this->idDodajacego); // konstruktor Uzytkownika działa na tej samej zasadzie co w Produkt
  18.    }
  19. }
  20. ?>


Po przekazaniu obiektu Produkt do Smarty z poziomu szablonu mam dostęp do wszystkich informacji z takiego oto drzewa:
Kod
Produkt
+ id
+ nazwa
+ ...
+ dodajacy
      Uzytkownik
      + id
      + login
      ...
+ zdjecia
      Zdjecia
      + lista
            1 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...
            2 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...
            3 - Zdjecie
                    + id
                    + nazwaPliku
                    + ...
                    + dodajacy
                      Uzytkownik
                      + id
                      + login
                      ...


Stworzenie takiej "hierarchii" może mieć sens jeśli chcemy wyświetlić wszystkie możliwe informacje np podpisując zdjęcia danymi użytkowników, którzy je dodali itp.

Mam jednak parę wątpliwości:
  1. Wszystkie pola klas (id, nazwa ...) są publiczne.
  2. Przekazujemy do Smarty obiekt (a w zasadzie cały zbiór obiektów), które przecież zawierają takie metody jak: Dodaj, Usun, Edytuj, których nie wymieniłem wcześniej, żeby nie zaciemniać. Czy przekazanie tych metod, które będą publiczne, jest bezpieczne?
  3. Czy rozwiązanie jakie przedstawiłem powyżej jest w ogóle warte uwagi? Proszę o komentarze.
bazyliszek83
Podstawowym założeniem obiektowości jest enkapsulacja, tzn. w skrócie : "jak największe ograniczenie dostępu do obiektu z zewnatrz". Dobrym nawykiem przy pisaniu klasy jest nadawanie domyślne pól i metod jako private lub protected. Dostęp do pól z "zewnatrz" powinien zawsze odbywać się za pomocą "getterów" i "setterów".
jasinskiwojciech
A co z metodami takimi jak Dodaj, Usun, Edytuj, Zaloguj?
bazyliszek83
Zasadniczo jeśli chcesz ich używać np. z poziomu Smarty, to dobrze jest wprowadzić jakaś publiczną metodę np. doAction($action,$type), która będzie swego rodzaju kontrolerem. Wtedy można łatwo manipulować dostępem do danych funkcji z zewnatrz.
jasinskiwojciech
Może napiszę inaczej:

Mam plik PokazProdukt.php, w którym tworzę obiekt typu Produkt, pobieram dane produktu i przekazuje go do Smarty. W pliku PokazProdukt.php korzystam więc z klasy Produkt, która posiada metodę "public Usun() { // usuwanie z bazy produktu o id=$this->id}". Metoda Usun() jest publiczna ponieważ w pliku administracjaProduktami.php mam mozliwość usunięcia produktu w taki sposób:
Kod
<?php
$produkt = new Produkt(1);
$produkt->Usun();
?>

Tak więc metoda ta musi być publiczna (?). Oczywiśćie dostęp do administracjaProduktami.php i do operacji Produkt->usun() mają tylko użytkownicy z odpowiednimi uprawnieniami. Mimo wszsytko czy przekazywanie obiektu z publiczną metodą Usun() do szablonu smarty jest bezpieczne - czy jest to podatne na jakiś atak z zewnątrz?
bazyliszek83
Jeżeli masz aplikacje zabezpieczoną pod względem "wstrzyknięcia kodu" (czytaj tutaj) to nie masz się o co martwić.

Natomiast, sama enkapsulacja jest ważna patrząc z poziomu stabilnego działania aplikacji. Najważniejsze jest to o czym pisałem w punkcie 1, czyli dostęp do pól za pomoca funkcji get... i set... . Idąc dalej, blokujemy krytyczne metody np. usuń przed dostepem z zewnątrz, jednocześnie dając możliwość jej wywołania przez wspomniany wcześniej kontroler.

Tak na prawdę można napisać "dobrą" aplikację bez stosowania tych głównych założeń. Ale trzeba pamiętać że dobry projekt to też taki który jest poźniej łatwy do pielegnacji i rozbudowy. Wyobraź sobie że do dużego projektu który napisałeś bez użycia tych podstawowych zasad, zasiada po jakimś czasie ktoś inny, potem jeszcze ktoś inny. Robi się bajzel, co ostatecznie może doprowadzić do dziwnych zachowań w aplikacji. Dlatego tak ważne jest stosowanie się do ogólnych wzorców:)
jasinskiwojciech
Dzięki za pomoc - już wszystko się wyjaśniło.
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.