![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.01.2007 Ostrzeżenie: (0%)
|
Jestem dopiero co zaczynającym "programistą" (haha) PHP. Programowanie proceduralne nie sprawia mi już większych kłopotów więc chcę wkroczyć na wyższy poziom. Niestety same podstawy tj. teoria nie wystarczy, żeby napisać coś samemu czyt. dobrze napisać. Więc tu się zwracam z prośbą do Was: Czy to coś poniżej ma jakiś związek z OOP? I czy z własnych doświadczeń możecie coś zaproponować, jakieś rozwiązania dalsze?
Klasa ObsługaNewsa z założenia ma być dostępna tylko z poziomu panelu administracyjnego. Kolejne pytanie: Jak rozwiązać problem wyświetlania kilku newsów na jednej stronie? Utworzyć kilka egzemplarzy klasy News? Tu zastanawiam się jak zrobić to, aby wykonać tylko jedno zapytanie do bazy danych? Czy można się w jakiś sposób pozbyć dodawania $db w parametrach metod??
Adriano. |
|
|
|
Post
#2
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Nie zniechęcaj się, ale to jest kod strukturalny ujęty w klasy (pseudo oop). Nie jest to nic złego, ale aby nie psuć pojęcia OOP, to nazywajmy to poop (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Błędy, które od razu rzucają się w oczy. 1. Nazewnictwo klas i metod. Pisz angielskie wersje 2. W tym wypadku News jest jedną tabelą, więc dobrze, aby był tak traktowany (to sie nazywa mapowanie relacyjno obiektowe - tu w podstawowej wersji na jednej tabeli). Częśc metod, jak np. obsługaNews:: pobierzNewsa($id) może być w samej klasie News. Ni eoznacz to bynajmniej, że ta klasa obsługaNews jest zbędna.
Pisane z palca, bez sprawdzenia, traktuj to jako pseudokod (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Pozdrawiam. p.s To nie jest jedyna metoda, anie też nie zawsze najlepsze. Jest za to szybka w implementacji i daje dość duże pole manewru. |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 5 Dołączył: 29.03.2006 Skąd: Poznań Ostrzeżenie: (0%)
|
@cysiaczek
Ja osobiscie nie wstawiał bym pobierania danych newsa w klasie reprezentujacej jego obiekt (News), bo i po co ma ona wiedziec jak i skad pobierac te dane? Pozwolicie ze przedstawie swoja idee (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
To chyba tyle, wydaje mi sie ze nie jest to najgorsze rozwiazanie z kilku wzgledow. 1. Mozemy w latwy sposob robic kopie obiektow - przy np. porownywaniu obiektow przed i po edycji 2. Nie wazne skad pobierzemy dane w NewsManager'rze bo i tak operujemy na obiekcie 3. Nie jestesmy uzaleznieny od nazewnictwa w bazie danych poniewaz stosujemy getery wiec gdy nam sie zmienia nazwa w bazie np. z title na title_a ( a uwierzcie mi takie rzeczy sie zdarzaja (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ) zmieniamy to tylko w managerze |
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Twoje jest bardzie oop ;]
Tylkp, że mi przyświecała inna idea. Chodziło o pokazanie, do czego przydaje się klasa NewsManager/NewsBase etc. |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.01.2007 Ostrzeżenie: (0%)
|
ooo właśnie o to mi chodziło. Dzięki wielkie za przykłady (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
To raczej niewiele ma wspólnego z OOP, ale jak pozbyć się $db (odwołania do bazy danych) w liście parametrów metody?
Robiąc podobnie jak Cysiaczek bez $db:
wywala mi błąd: Kod Fatal error: Call to a member function query() on a non-object in w linijce: Kod if (!$wynik=$db->query($sql)) echo " z tego!"; Czy da się to jakoś obejść? |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 5 Dołączył: 29.03.2006 Skąd: Poznań Ostrzeżenie: (0%)
|
@adriano321
Możesz przekazać handler połączenia w konstruktorze
I wtedy odwołujesz się w metodzie poprzez $this->dbh np. $this->dbh->query(), $this->dbh->fetch() etc. Albo też możesz użyć singletona ( http://www.phppatterns.com/docs/design/singleton_pattern ) lub rejestru( http://www.phppatterns.com/docs/design/the_registry ). Ten post edytował Whisller 12.02.2008, 17:44:05 |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.01.2007 Ostrzeżenie: (0%)
|
No to teraz zaprezentuję całą klasę news(na podstawie klasy Whisllera, dzięki chłopaki), może komuś się w przyszłości przyda (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) . Jakby ktoś miał jakieś zastrzeżenia to proszę o przedstawienie ich, będą one na pewno bardzo pomocne w dalszej pracy.
Adrian. Ten post edytował adriano321 14.02.2008, 18:28:12 |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 5 Dołączył: 29.03.2006 Skąd: Poznań Ostrzeżenie: (0%)
|
@adriano321
1. Nie rób echo w metodzie klasy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Bo dajmy na to będziesz chciał komunikat o błędzy zapisać do pliku albo też wysłać mailem, co wtedy? Zwracaj go w postaci stringa albo też wyrzucaj wyjątek. 2. W metodzie getOne nie musisz wartości przypisywać to tablicy $args jeśli nazwy pól w bazie danych są takie same jak indeksy w tablicy argumentów przyjmowanej przez konstruktor klasy News. Tzn. możesz sobie skrócić pracę pisząc $r = mysql_fetch_assoc($sth); return new News( $r ); 3. Zamiast robić metodę getNewsList można by pokusić się o to aby klasa NewsManager dziedziczyła po jakiejś klasie - lub też otrzymywała obiekt klasy - w której określał byś jakie pola chcesz pobrać oraz kryteria do WHERE, tak mi się wydaje. A chesz zostawić tą metodę tak jak jest to daj albo sprawdzanie czy zmienna $sort jest ustawiona na DESC albo ASC lub też daj wartość domyślną dla tego argumentu( public function getNewsList($sort='ASC') ). |
|
|
|
Post
#9
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 258 Pomógł: 16 Dołączył: 21.09.2004 Skąd: Kielce Ostrzeżenie: (0%)
|
A nie byłoby czytelniej zamiast tych wszystki setCosTam i getCosTam, zrobić tak?
a potem np.
zamiast n metod dla n właściwości są 2. |
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.01.2007 Ostrzeżenie: (0%)
|
Cytat 1. Nie rób echo w metodzie klasy smile.gif Bo dajmy na to będziesz chciał komunikat o błędzy zapisać do pliku albo też wysłać mailem, co wtedy? Zwracaj go w postaci stringa albo też wyrzucaj wyjątek. 2. W metodzie getOne nie musisz wartości przypisywać to tablicy $args jeśli nazwy pól w bazie danych są takie same jak indeksy w tablicy argumentów przyjmowanej przez konstruktor klasy News. Tzn. możesz sobie skrócić pracę pisząc $r = mysql_fetch_assoc($sth); return new News( $r ); 3. Zamiast robić metodę getNewsList można by pokusić się o to aby klasa NewsManager dziedziczyła po jakiejś klasie - lub też otrzymywała obiekt klasy - w której określał byś jakie pola chcesz pobrać oraz kryteria do WHERE, tak mi się wydaje. A chesz zostawić tą metodę tak jak jest to daj albo sprawdzanie czy zmienna $sort jest ustawiona na DESC albo ASC lub też daj wartość domyślną dla tego argumentu( public function getNewsList($sort='ASC') ). 1. To jest na razie wersja robocza, zapomniałem usunąć echa, mam zamiar wyrzucać wyjątki ale to dopiero później dopiszę. 2. Też tak na początku myślałem ale po $db->fetch_array() otrzymywałem tablicę: Kod Array ( [0] => 8 [id] => 8 [1] => CSM [title] => CSM [2] => CSM [text] => CSM [3] => 2012-01-01 05:01:20 [date] => 2012-01-01 05:01:20 [4] => 2042-01-01 06:01:20 [editDate] => 2042-01-01 06:01:20 [5] => 231 [idAuthor] => 231 [6] => 2 [idKategory] => 2 ) // yyy nie no rzeczywiście przecież to nie mało by żadnego znaczenia (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) hehe dobra to już wiem co i jak. @revyag - dobra uwaga (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 663 Pomógł: 6 Dołączył: 3.06.2007 Skąd: Kraków Ostrzeżenie: (0%)
|
Tak czytam i widzę, że siedzimy w tym samym temacie. Przeczytaj mój wątek na temat klasy db_driver i jak 'singleton' rozwiązuje sprawę, z przekazywaniem obiektu $db:
http://forum.php.pl/widocznosc_obiektu_wew...asy_t87343.html |
|
|
|
Post
#12
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Można też tak, co pozwala na zachowanie interfejsu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
|
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 1 Dołączył: 24.01.2007 Ostrzeżenie: (0%)
|
Czy to jest dobrze? Albo raczej czy to jest zgodne ze wzorcem Singleton?
Ten post edytował adriano321 16.02.2008, 12:38:44 |
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 5 Dołączył: 29.03.2006 Skąd: Poznań Ostrzeżenie: (0%)
|
@revyag
Jasne że można ale tylko wtedy gdy masz pewność że nie będziesz przeprowadzał w setach jakiś walidacji/filtracji etc. choćby rzutowania. Co wtedy? Nie zrobisz w __set switch z wyłapywaniem nazw pól i odpaleniem odpowiedniego rzutowania (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) -- Edit Ok mozna by napisac metody dla wartosci przy ustawioniu ktorych przeprowadzamy walidacje etc ale jakos osobiscie przyzwyczailem sie do takiego sposobu pisania + z tego co slyszalem ( nie przeprowadzalem wlasnych testow ) metody magiczne typu __set __get __call etc. sa wolniejsze. Ten post edytował Whisller 18.02.2008, 09:48:08 |
|
|
|
Post
#15
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 258 Pomógł: 16 Dołączył: 21.09.2004 Skąd: Kielce Ostrzeżenie: (0%)
|
@Whisller ale ja nie podałem __set tylko set__ (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) To mała ale zasadnicza różnica. I to wszystko o czym mówisz da się zrobić. np. jako trzeci parametr podawać typ parametru.
__set wykorzystałbym do czegoś innego. |
|
|
|
Post
#16
|
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Może i odrobinę wolniejsze, ale jak masz mieć 100 setterów i getterów, to lepiej chyba magiczne dać (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif) Ja tam je polubiłem - zwłaszcza __call, którego implementację dawałem i która jest bardzo uniwersalna.
|
|
|
|
Post
#17
|
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%)
|
Jak dla mnie te wszystkie magiczne metody robią burdel w kodzie i tyle.
Chociaż tak prosta rzecz jak podpowiadanie nie będzie w tedy działać i nikt mi nie powie że to będzie upierdliwe. Moim zdaniem klasa powinna mieć jawny interfejs a nie jakieś sztuczki. (w sumie to brak typizacji argumentów [co pociąga brak możliwości definicji metod o tej samej nazwie a różnych argumentach] w PHP też mnie irytuje) A nie wiem mi się nie zdarzyło abym w jednej klasie musiał pisać 100 metod get i set... |
|
|
|
![]() ![]() |
|
Aktualny czas: 21.12.2025 - 19:52 |