Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mvc][model] Iteratory
Forum PHP.pl > Forum > PHP > Object-oriented programming
Vengeance
Witam. Moje pytanie jest następujące...

czy lepiej będzie oprzeć model (np. taki NewsContainer) na metodach w stylu:
getNewsByID()
getAllNews()
deleteNewsByID()

czy moze lepiej wszystko oprogramowac jako Iteratory (oczywiscie w role wchodzi tylko php5) i w php operowac na bazie sql jak na normalnych tablicach.

Owszem ladnie wyglada to drugie rozwiazanie... jednak probowalem je 'wdrazac' i szlo mi bardzo ciezko :/

Co wy o tym sadzicie.
hwao
Wg mnie powinienes wprowadzac wg czego jako argument najlepiej jako tablica bardzo elastyczne i sie nie napiszesz za duzo (rozne zachodza potrzebny wtedy sie przydaje ze mozna dac tablice)
np
array( 'id' => 1 );
Wybierze newsa z id 1
array( 'id' => 3, 'user' => 'hwao' )
Wybierrze cos z id 3 i 2 warunek ze musi jeszcze byc user hwao :-)
Vengeance
hwao: troche źle mnie zrozumiałeś smile.gif
  1. <?php
  2. $newsList = new NewsContainer();
  3.  
  4. // Pobiera newsa o ID 1
  5. $news = $newsList[1];
  6.  
  7. // Edytuje pobranego newsa.
  8. $news['title'] = 'Inny tytul';
  9.  
  10. // Usuwa newsa o ID 2
  11. unset($newsList[2]); 
  12. ?>

I wszystko to automatycznie wprowadza odpowiednie zmiany w bazie smile.gif
Da się to uzyskać np. poprzez interfejs ArrayAccess
hawk
To tutaj nie masz iteratorów tylko ArrayAccess właściwie. IMHO twój przykład jest technicznie fajny, ale mało zrozumiały - przegięcie z bajerami. Ja bym wolał:
  1. <?php
  2. $news = $newsList->findById(1);
  3.  
  4. $news->title = 'foo';
  5. // ... lub ...
  6. $news->setTitle('foo');
  7.  
  8. $newsList->delete(1);
  9. ?>


$news['title'] jest możliwe ale bardzo zakręcone i tak naprawdę nic nie daje poza dezorientacją. $news->title jest już znacznie lepsze, jeżeli nie chcemy pisać metody setXXX() dla każdego atrybutu. Gorzej, jeżeli ustawienie tego atrybutu wymaga jakiś nietrywialnych operacji - wtedy w metodzie __set() musiałbyś mieć paskudnego switcha.

Natomiast usuwanie realizowane za pomocę destruktorów jest bardzo ciekawe, ale trochę bym się obawiał. Powody:
1) Destruktory będą wywoływane same z siebie na końcu skryptu.
2) Zawsze można utworzyć obiekt $news ręcznie (czyli bez odpowiednika w bazie danych), i co wtedy zrobi destruktor?
3) Jeżeli wystąpi jakiś problem przy zapytaniu DELETE, to jak poinformować użytkownika? Destruktor rzucający wyjątek?

Chociaż, jeżeli uda się ominąć trudności techniczne, jest to bardzo ciekawy pomysł. Rozwiązuje problem istnienia obiektu $news po usunięciu newsa - łączy usunięcie obiektu z usunięciem rekordu z bazy danych, a to jest duża zaleta.
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.