![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 9 Dołączył: 14.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Dopiero zacząłem przygodę z obiektowym PHP. Uczyłem się z książki 'Zaawansowane tworzenie stron www PHP5 Szybki start'.
Udało mi się wykombinować taki kod: http://www.wklej.com.pl/show.php?what=20080812201428 Ma to służyć jako miniCMS, to są klasy do zarządzania podstronami. Chciałbym się zapytać czy to jest wogóle obiektowo, bo mi się wydaje że to są zwykłe funkcje pogrupowane w klasy. Nie wiem czy rozumiem ideę obiektowego programowania. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 535 Pomógł: 27 Dołączył: 3.05.2005 Ostrzeżenie: (20%) ![]() ![]() |
Niestety jest to tylko kod strukturalny zamknięty w klasach i funkcjach.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 4 Dołączył: 31.07.2006 Skąd: Oława Ostrzeżenie: (0%) ![]() ![]() |
No trochę lipa. Utwórz np klasę podstrona i w niej metody, źle to IMO podzieliłeś. I stwórz klasę baza a nie polacz
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 9 Dołączył: 14.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Zmieniłem to w jedną klasę podstrony.
Nie widzę innej możliwości rozwiązania tego. Według mnie jest wszystko dobrze. Jedna klasa pobiera dane, druga je wyświetla. O to chyba w tym chodzi, nie? |
|
|
![]()
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%) ![]() ![]() |
Tak jak ktoś wyżej napisał, myślisz funkcjonalnie. Obiekt to nie zbiór funkcji. Obiekt reprezentuje jakąś konkretną "rzecz".
Pozdrawiam! |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Nie, niestety nie chodzi o to. Przynajmniej nie wprost. Obiekty są po to, aby reprezentowały jakieś rzeczy. W przypadku strony www, może to być obiekt Page (zawsze używaj nazw angielskich - to bardzo ważne), który posiada właściwości i operacje. Nie jest jednak reprezentacją dokumentu HTML, tylko danych, które ta stronę tworzą (wpisy w bazie danych lub w pliku tekstowym). Poczytaj więcej, w bardziej specjalistycznych książkach (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Pozdrawiam. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 9.01.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
W sumie nie wiem czy rozpoczęcie nauki programowania obiektowego od PHP to najlepsze rozwiązanie. Ja OOP nauczyłem się na C++ i Tobie też to polecam, chociaż na początku może być trudno, ale nie ma nic za darmo (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Poza tym C++ to kanon, który co prawda bywa czasem trochę upierdliwy, bo wszystko musi się zgadzać i jest mniej elastyczne niż nowsze języki, ale to uczy porządnego programowania.
Bazując na swoim przykładzie, polecam naukę podstaw C++, potem wskaźników i wtedy programowanie obiektowe w C++. Jeszcze odnośnie Twojego kodu, to zrobiłeś zbiór funkcji, jak poprzednicy pisali; klasy charakteryzują się tym, że obiekty z nich utworzone posiadają 1) zmienne i 2) metody (funkcje) i jedno i drugie jest w równym stopniu ważne, więc tworzenie klas tylko ze zmiennymi albo tylko z funkcjami niewiele nam daje, dopiero połączenie obu pozwala wykorzystać masę funkcjonalności. Tworzysz klasę i później możesz stworzyć wiele obiektów, które są niezależne od siebie, mają inne dane (zmienne), ale korzystają z tych samych metod. Trywialny przykład:
Coś bardziej zbliżonego do Twojego kodu - obiekt 'Tabela':
Oczywiście to też przykład trywialny, jedynie obudowanie zwykłego arraya, ale niewiele zmieniając można już poprawić trochę jakość zwyczajnej tablicy, np. walidować dane wejściowe, czyli w funkcji addRow sprawdzać czy $text jest taki jak nam odpowiada, czy nie jest za długi etc. etc. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@qBK w PHP5 nie ma var, jest private, protected, public (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 9 Dołączył: 14.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Pomęczyłem się pół dnia i trochę już łapię. Zrobiłem to tak aby jak najwięcej kodu móc wykorzystać w przyszłości.
Klasa: http://www.wklej.com.pl/show.php?what=20080813115015 Wykorzystanie klasy: http://www.wklej.com.pl/show.php?what=20080813115116 Wg tego zrobie potem zarządzanie newsami, menu itd, wszystko tą samą klasą. Chciałem jeszcze przenieść zapytanie do klasy jakoś, ale nie wiem zabardzo jak i czy warto. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 085 Pomógł: 231 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Jak już się uczysz, to nabieraj od podstaw sensownych przyzwyczajeń - rozdzielaj kod php od html w tym przypadku, w bardziej ogólnym zainteresuj się wzorcem MVC.
Zarządzanie wszystkim tą samą klasą? Co ma wspólnego menu z newsami? Na zdrowy "chłopski" rozum są to dwa różne obiekty, np do jednego są komentarze, do drugiego ni hu hu, jedno i drugie jest inne. Zapoznaj się z dziedziczeniem, interfejsami (możesz sobie zrobić ogólną klasę (lub interface), faktycznie, ale potem ją implementować, czy rozszerzać do swoich potrzeb nie zawierając w nich zupełnie niepotrzebnych metod czy własności). Ten post edytował Shili 13.08.2008, 15:50:54 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 17 Pomógł: 0 Dołączył: 9.01.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
@qBK w PHP5 nie ma var, jest private, protected, public (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Hah, coś mi od początku to var nie pasowało do PHP-a, ale wszystko działało więc się nie zorientowałem (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Przeglądałem pewnie jakiś stary kod i mi się zakorzeniło w głowie. A modyfikatorów nie używałem bo kod private var $x krzaczył mi się i nie wiedziałem o co chodzi (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Dzięki za zwrócenie uwagi. edit @marcinpruciak: Jeśli zrobiłeś już klasę Baza, to dodaj na przykład w niej metodę 'query' albo 'execute'
i zamiast wywoływać $r=mysqli_query($baza->polacz, $q); możesz pisać $r=$Baza->query($q) Jest trochę krócej i później powiedzmy przechodząc z MySQL na PostgreSQL nie będziesz musiał każdego mysqli_query zamieniać na pg_query. Ten post edytował qBK 13.08.2008, 19:57:45 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie private var $abc, a private $abc (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 9 Dołączył: 14.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Trochę pomyślałem, pokombinowałem i mam. Nie jest to MVC, bo gubię się przy oddzielnych trzech klasach, ale jest oddzielony widok od logiki.
I użycie tej klasy w innej klasie: (muszę to jeszcze ulepszyć)
I co o tym myślicie? Nieźle jak na pierwszy kontakt z obiektowością? |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) ![]() ![]() |
Cytat Nieźle jak na pierwszy kontakt z obiektowością? Źle. Powinieneś mieć logikę wywołującą widok, a nie widok wywołujący logikę. Czyli najpierw myślisz co trzeba zrobić (np. na podstawie informacji z $_GET) Potem wykonujesz te swoje działania ($pub->oblicz(), $pub->zastosuj(), $pub->pobierz_id_pub(), a wyniki zapisuj sobie na boku w jakichś zmiennych) Na końcu, gdy już jesteś pewien co(i czy w ogóle) chcesz wyświetlić, to wstawiasz sobie te zmienne do HTML'a |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 403 Pomógł: 68 Dołączył: 20.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Abstrahując od twojego problemu, jeżeli chodzi o rozdzielenie logiki to poczytaj o MVC sam niedawno się z tym męczyłem i wydawało mi się to wręcz bez sensowne ale później po przemyśleniu i napisaniu pierwszego skryptu MVC zrozumiałem o co biega tak z biegu podam prosty przykład
sens powyższego jest żaden, natomiast moim zdaniem dobrze obrazuje idee MVC. Zauważ że dzięki temu, jeżeli np. będziesz chciał dodać obsługę bazy mysql, to zostanie ci do zmiany tylko model, a jeżeli będziesz chciał dać możliwość obejrzenia newsa w pdf to wystarczy dopisać odpowiedni widok. Ten post edytował f1xer 22.08.2008, 14:21:34 |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 9 Dołączył: 14.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Tylko jak poradzić sobie z pętlą? Wszystkie przykłady co widziałem nie miały takiej pętli. To jedyny sposób jaki znam.
Bo ważniejsze zmienne nie pobieram z geta tylko z tablicy. I te wszystkie funckje też muszą być w pętli. |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 403 Pomógł: 68 Dołączył: 20.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
jeżeli masz jusz dane w tablicy to tą tablicę przekazujesz do widoku a w widoku wyciągasz wszystkie elementy tablicy i dekorujesz html później wyrzucasz do przeglądarki. Generalnie to jest tak w uproszczeniu
Kontroler - przyjmuje zapytanie i podejmuje decyzje co zrobić, jeżeli potrzebne są jakieś dane ze źródła danych (plik,baza,SOAP etc.) to prosi Model o przygotowanie takich danych. Model - pobiera dane ze źródła danych i zwraca kontrolerowi (w postaći np. tablicy) Kontroler dostaje dane i wywołuje odpowiedni widok Widok - dostaje "surowe" dane i przygotowywuje je do prezentacji (np. dostał tablicę to robi na niek foreach i dla każdego wiersza dodaje tagi html) po czym wyrzuca do przeglądarki. odnośnie twojego mini CMS (też taki pisze (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ) to nie potrzeba duzo roboty od frontu model ma np. 1 metode pokaz_strone($id) i wniej wczytujesz z bazy treść strony, widok też ma co najmniej jedną metodę pokaz($strona) dostaje treść strony od modelu i np. wyrzuca to pomiędzy tagami <p></p> a kontroler np. sprawdza czy w $_GET jest podane id jeżeli tak to wywołuje model z tym id a pozniej widok ze zwróconą przez model wartością, jeżeli id nie ma to wczytuje stronę domyślną. Ten post edytował f1xer 22.08.2008, 17:32:14 |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 9 Dołączył: 14.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Zedytowałem to tak:
Chyba o to chodzi? Mam tylko jeden problem. Metoda tworząca tablicę z wyników z bazy dodaje do tablicy tylko pierwszy wiersz z bazy? Nigdzie nie widzę błędu? Co jest nie tak? Ten post edytował marcinpruciak 22.08.2008, 23:48:20 |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 113 Pomógł: 19 Dołączył: 2.08.2007 Ostrzeżenie: (0%) ![]() ![]() |
Zobacz w manualu opis funkcji mysql_fetch_assoc(), zwróć uwagę na pętle while w przykładzie.
Pozdr |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 161 Pomógł: 9 Dołączył: 14.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
Udało się. Dzięki za sugestię.
Dalej ćwiczę obiektowość, stworzyłem teraz klasę dodawania i edycji stron: http://wklej.com.pl/show.php?what=20080828234035 Jest to zgodne z obiektowością? Strona działa i ma się dobrze tutaj można zobaczyć jak: http://195.205.202.32:6893/minicms/index.php?page=pages Proszę o odpowiedź. Ten post edytował marcinpruciak 28.08.2008, 22:44:29 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 7.10.2025 - 14:30 |