Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obiekty
Forum PHP.pl > Forum > PHP > Object-oriented programming
conmar
Witam,

Mam taki problem ze zrozumieniem jednej rzeczy. Powiedzmy, ze mam w bazie tablice articles gdzie trzymam swoje artykuły.Teraz mam klasę powiedzmy Articles która pobiera dane z bazy i dla każdego wiersza tworzy na podstawie klasy Article obiekt Article.
Obiekt Article udostepnia metody do pobierania danych np. getID, getContent, getTtitle itd. I teraz mój problem jest taki, że nie wiem gdzie umieścić metody add i del ktore by odpowiednio dodawaly nowy artykul i kasowaly istniejacy. Czy to powinno byc w klasie Articles czy też w Article. Bo jezeli w Article to powiedzmy, że wykonam na obiekcie metode del to artykul sie skasuje a obiekt bedzie wskazywal na coś co nie istnieje i nie wiem czy tak moze byc.

Pozdrawiam.
marcio
PO usuneciu mozesz uzyc unset() na dany obiekt wtedy go usuniesz.
LBO
Twój obiekt Articles, z tego co napisałeś, jest swoistym managerem - ona powinna być odpowiedzialna za taką operacje. Ale to w teorii. W praktyce obiekt Article też mógłby potrafić usunąć sam siebie.

  1. <?php
  2. class Article {
  3.    protected $id;
  4.    
  5.    public function setId($id)
  6.    {
  7.        $this->id = $id;
  8.    }
  9.  
  10.    public function delete()
  11.    {
  12.        print "DELETE FROM articles WHERE id = {$this->id}" . PHP_EOL;
  13.        // Tutaj usuwamy artykuł z bazy. Zapewne jednym zapytaniem SQL
  14.        //unset($this); // to nie będzie działać - trzeba sunąć obiekt na zewnątrz
  15.    }
  16.  
  17.    public function __destruct()
  18.    {
  19.        print "Usuwanie obiektu Article (id = {$this->id})" . PHP_EOL; // Podejrzymy sobie, kiedy faktycznie niszczymy obiekt
  20.    }
  21. }
  22.  
  23. class Articles
  24. {
  25.    public function deleteArticle(Article &$article)
  26.    {
  27.        $article->delete(); // PROXY
  28.        //unset($article); // to też nie zadziała;
  29.        $article = null; // ale to już działa i uaktywnia destruktor
  30.    }
  31. }
  32.  
  33. // Stwórzmy obiekcik Article - załóżmy, że wyciągnęliśmy go wcześniej z bazy.
  34. $article = new Article();
  35. $article->setId(1);
  36.  
  37. $manager = new Articles();
  38.  
  39. $manager->deleteArticle($article);
  40.  
  41. var_dump($article); // Dzięki $article = null; $article nie jest już obiektem (unset() nie działa w ten sposób niestety).
  42. ?>


Czego wynikiem będzie:

Cytat
DELETE FROM articles WHERE id = 1
Usuwanie obiektu Article (id = 1)
NULL


No dobra, to nie jest zbyt skomplikowane. Wygląda na to, że lepiej i szybciej by było użyć samego $article->delete(). Prawdziwy sens pokazuje się gdy chciałbyś usunąć więcej niż jeden obiekt Article.

  1. <?php
  2. // Łopatologicznym sposobem by to wyglądało tak
  3. for ($i = 1; $i <= 10; $i++) {
  4.    // torzymy kilka obiektów artykułów. Załóżmy, że wyciągnliśmy je z bazy.
  5.    $articles[$i] = new Article();
  6.    $articles[$i]->setId($i);
  7. }
  8.  
  9. foreach($articles as $article)
  10. {
  11.    $article->delete();
  12. };
  13. unset($articles);
  14. var_dump($articles);
  15. ?>


Czego wynikiem będzie:

Cytat
DELETE FROM articles WHERE id = 1
DELETE FROM articles WHERE id = 2
DELETE FROM articles WHERE id = 3
DELETE FROM articles WHERE id = 4
DELETE FROM articles WHERE id = 5
DELETE FROM articles WHERE id = 6
DELETE FROM articles WHERE id = 7
DELETE FROM articles WHERE id = 8
DELETE FROM articles WHERE id = 9
DELETE FROM articles WHERE id = 10
Usuwanie obiektu Article (id = 1)
Usuwanie obiektu Article (id = 2)
Usuwanie obiektu Article (id = 3)
Usuwanie obiektu Article (id = 4)
Usuwanie obiektu Article (id = 5)
Usuwanie obiektu Article (id = 6)
Usuwanie obiektu Article (id = 7)
Usuwanie obiektu Article (id = 8)
Usuwanie obiektu Article (id = 9)
Usuwanie obiektu Article (id = 10)
NULL


Niefajnie, prawda? 10 zapytań... na pomoc biegnie obiekt Articles.

  1. <?php
  2. // Dodajmy tę metodę do klasy Articles
  3.    public function deleteArticles(array &$articles)
  4.    {
  5.        foreach($articles as $article)
  6.        {
  7.            $ids[] = $article->getId();
  8.        }
  9.        print "DELETE FROM articles WHERE id In (" . implode(',', $ids) . ")" . PHP_EOL;
  10.        $articles = array();
  11.    }
  12. ?>


Teraz, gdy użyjemy Articles::deleteArticles()

  1. <?php
  2. for ($i = 1; $i <= 10; $i++) {
  3.    // torzymy kilka obiektów artykułów. Załóżmy, że wyciągnliśmy je z bazy.
  4.    $articles[$i] = new Article();
  5.    $articles[$i]->setId($i);
  6. }
  7.  
  8. $manager = new Articles();
  9.  
  10. $manager->deleteArticles($articles);
  11.  
  12. var_dump($articles); // Dzięki $article = null; $article nie jest już obiektem (unset() nie działa w ten sposób niestety).
  13. ?>


Cytat
DELETE FROM articles WHERE id In (1,2,3,4,5,6,7,8,9,10)
Usuwanie obiektu Article (id = 1)
Usuwanie obiektu Article (id = 2)
Usuwanie obiektu Article (id = 3)
Usuwanie obiektu Article (id = 4)
Usuwanie obiektu Article (id = 5)
Usuwanie obiektu Article (id = 6)
Usuwanie obiektu Article (id = 7)
Usuwanie obiektu Article (id = 8)
Usuwanie obiektu Article (id = 9)
Usuwanie obiektu Article (id = 10)
array(0) {
}


Tylko jedno zapytanie!

To jest oczywiście bardzo, bardzo prosty przykład, ale ilustruje co można zyskać na rozbudowie zależności między obiektami.
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.