czy pisać to obiektowo? |
czy pisać to obiektowo? |
1.08.2008, 14:51:55
Post
#1
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
Witam!
Uczę się PHP i postanowiłem napisać CMSa.. Już mam dodawanie/edytowanie podstron, menu. Mój CMS wszystko sobie zapisuje w bazie MySql. Wyczytałem, że lepszym sposobem programowanie jest programowanie obiektowe. Tylko właśnie nie do końca wiem czy lepiej pisać to obiektowo czy nie... i to jest moje pytanie Np. w PANELU ADMINA w dziale PODSTRONY mam to zrobione tak: *zapytanie:
*za pomocą: wyświetlam wszystko w tabeli, USER może sobie zaznaczyć kilka PODSTRON i kliknąć USUŃ. DOKUMENT SIE PRZELADOWUJE I MAM W ZMIENNYCH POST/GET NUMERY ID PODSTRON DO USUNIECIA *zapytanie: usuwa podstronę A jeżeli dobrze zrozumiałem to obiektowo musiałoby to wyglądać jakoś tak: tworze sobie klasę, w niej zmienne private $id,$status,$nazwa,$data_utworzenia,$data_edycji,$autor. Jako obiekty ładuje do klasy wszystko z MySql - każda podstrona to jeden obiekt. hmm tworze sobie funkcję w klasie która mi będzie wyświetlać tak jak wczesniej po kolei dane... USER zaznacza kilka do usuniecia i teraz zeby usunac dane funkcją np. UsunDane() (ktorą sobie stworze w klasie) to musze najpierw wczytac dane obiekty i potem wywolac fukncje UsunDane().. A normalnie po prostu usuwam obiekty o danym ID bez wczytywania ich. wiec wychodzi dłużej ;/ Czyli obiektowo czy nie? Moze ja nie rozumiem obiektowoście po prostu jeszcze, moze to sie roi inaczej?? Ten post edytował marekc12 1.08.2008, 14:56:24 |
|
|
1.08.2008, 14:55:03
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) |
|
|
|
1.08.2008, 20:50:56
Post
#3
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
dobra, trochę poczytałem i na początek napisałem klasę do obsługi bazy danych:
W ten sposob przynajmniej teoretycznie zyskałem na bezpieczeństwie, gdyż np. hasło do bazy jest dostępne tylko z wewnątrz klasy BazaSql smile.gif to są moje naprawdę początki (uczę się od przed wczoraj programowania obiektowego ;D) i napiszie mi co myślicie o tym kodzie? coś mi się wydaje ze się okaze to jest całkiem nie tak haha.gif Ten post edytował marekc12 1.08.2008, 20:51:51 |
|
|
1.08.2008, 20:59:11
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 657 Pomógł: 125 Dołączył: 29.04.2006 Ostrzeżenie: (0%) |
no nie do końca takie bezpieczniejsze, ponieważ można to uzyskać poprzez
echo BazaSql::SQLPASS; Niepotrzebnie rozdzielasz zapytanie od bazasql. Oprócz tego jest ok. -------------------- |
|
|
1.08.2008, 21:01:59
Post
#5
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
czyli lepiej chyba nie robić tego jako stałe ale zmienne private, wtedy będzie bezpiecznie.
Rozdzielając to myślałem właśnie o bezpieczeństwie, żeby funkcja "Zapytanie" nie miała dostępu do hasła do bazy. W razie np SqlInjection (przed którym oczywiscie mozna sie zabezpieczać) było by jeszcze bardziej bezpiecznie. Chociaż w razie takiego ataku i tak chyba haker może zrobić wszystko .. więc może i to nie ma sensu.. Ten post edytował marekc12 1.08.2008, 21:05:41 |
|
|
1.08.2008, 21:55:50
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 085 Pomógł: 231 Dołączył: 12.05.2008 Ostrzeżenie: (0%) |
Cytat Rozdzielając to myślałem właśnie o bezpieczeństwie, żeby funkcja "Zapytanie" nie miała dostępu do hasła do bazy. W razie np SqlInjection (przed którym oczywiscie mozna sie zabezpieczać) było by jeszcze bardziej bezpiecznie. W ataku sql injection hasło jest co najmniej zbędne. "Haker" już jest połączony z bazą, więc w przypadku luki i tak zrobi co chce.Jeśli zrobisz zmienne private, to klasa Zapytanie już ich nie odziedziczy. Ze swojej strony również proponuję zrobić z niej metodę do klasy BazaSql Ten post edytował Shili 1.08.2008, 21:56:33 |
|
|
1.08.2008, 22:03:09
Post
#7
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
|
|
|
1.08.2008, 22:26:00
Post
#8
|
|
Grupa: Zarejestrowani Postów: 439 Pomógł: 21 Dołączył: 28.06.2007 Skąd: Bielsko-Biała Ostrzeżenie: (0%) |
a nie lepiej poprostu skożystać z jakiejś gotowej klasy/klas do obsługi DB? "u nas w necie tego pełno"
-------------------- "Na przykład zmiennej $jestem_najlepszy przypisujemy wartość logiczną TRUE"
Ja: użyj funkcji[...] Grins: mów normalnie do mnie a nie po polsku Ja: normalnie to znaczy jak? Grins: No w PHP... inaczej mój parser ledwo kuma:) |
|
|
2.08.2008, 00:04:55
Post
#9
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
Czy uważacie, że opłaca się pisać obiektowo jeżeli to nic nie da oprócz ładniejszego kodu?
No bo ja np. nie widzę innych pozytywnych stron jeżeli chodzi o moją klasę do bazy danych oprócz tego, że funkcje do baz są ładnie zgrupowane w klasę. Tak samo chyba będzie z obsługą podstron w moim CMSie, bo nie wiem czy coś mi da że podstrony będą obiektem Wg was lepiej pisać obiektowo, choćby dla ładniejszego kodu? Niby jeżeli chodzi o ilość kodu to w sumie na to samo chyba wyjdzie.... no mi się wydaje, że lepiej jednak obiektowo. EDIT: przeglądam posta: Temat: PHPOOP Czy to tak moze byc i tam jest taki kod:
Założyłem że to tak ma wyglądać, ale hmmm zaraz się pewnie okaże, że to tak się nie robi, czy tak?? No bo tak to ta obiektowość nic nie daje w tym przypadku bo to samo można napisać za pomocą zwykłej funkcji. Ten post edytował marekc12 2.08.2008, 00:22:13 |
|
|
2.08.2008, 00:35:12
Post
#10
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
Na początku tak się wydaje, że tylko ładniej, jak zaczniesz pojmować o co w tym chodzi, to zaczniesz rozumieć jaka jest w tym siła. Programowanie obiektowe, to nie jest jedna klasa, czy dwie, to wiele współpracujących ze sobą obiektów, ale aby to zrobić użytecznie, ładnie i elastycznie trzeba dużo czasu.
Moim zdaniem powinieneś zainwestować w książkę (choć nie powinno się brać tego co autor pisze jak prawdę, bo czasem mają głupie poglądy), poczytać kod jakiś prostych rzeczy napisanych obiektowo, czy chociażby je wykorzystać. Wtedy zrozumiesz jak to działa, bo samemu dochodząc bez przykładów, to zajmie wieki... Spróbuj zintegrować swój projekt z Propel, poużywać go, na pewno wiele się dzięki temu nauczysz. @marekc12 Uważaj na to co znajdziesz w internecie, bo czasem niby mądre osoby, a głupoty piszą. Powinieneś zacząć od tego co ma ten obiekt robić, jaki ma zakres obowiązków, a potem dopiero wyszczególniać metody i właściwości. Czyli np. ma łączyć się z bazą i umożliwiać wykonywanie kwerend na niej. Co jest z interfejsu, wykonywanie kwerend, teraz pytanie jak to komplikować: - można podzielić na dwa rodzaje, te co zwracają coś (SELECT) i te co nie zwracają (UPDATE/INSERT itp) więc można je rozdzielić, i wtedy np. jedna metoda zwraca tablice rekordów, a druga nic... czy jakkolwiek, ale wszystkie mysql_*() powinny być w jednej klasie, a inne korzystać tylko z jej interfejsu. -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
2.08.2008, 01:03:12
Post
#11
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
Czy taki kod jest ok? Oczywiscie jest to tylko zarys;) Ale czy to co jest jest ok? no i martwi mnie to ze jest tylko 1 obiekt... dlatego nie wiem czy to tak ma być Ten post edytował marekc12 2.08.2008, 01:06:35 |
|
|
2.08.2008, 09:59:10
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 657 Pomógł: 125 Dołączył: 29.04.2006 Ostrzeżenie: (0%) |
Kod private $podstrony; public function listaPodstron() { $this->podstrony = BazaSql::wyslijZapytanie('SELECT `id`, `status`, `nazwa`, `data_utworzenia`, `data_edycji`, `autor`, `tekst` FROM `podstrony` ORDER BY `id`'); return($this->podstrony); } Bez sensu. Nie można po prostu Kod public function listaPodstron() { $podstrony = BazaSql::wyslijZapytanie('SELECT `id`, `status`, `nazwa`, `data_utworzenia`, `data_edycji`, `autor`, `tekst` FROM `podstrony` ORDER BY `id`'); return $podstrony; } ? -------------------- |
|
|
2.08.2008, 10:13:22
Post
#13
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
hmmm ale to w ogólnie nie wykorzystuje obiektowości.... myślałem, że to się robi jakoś inaczej, ;p
No to w sumie tak jak po staremu Ten post edytował marekc12 2.08.2008, 10:13:49 |
|
|
2.08.2008, 10:25:00
Post
#14
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
@marekc12
Widzisz użyte mysql_fetch_row(), a tego nie powinno być poza obiektem. Wydaje mi się, że powinieneś mieć dwie metody, jedna do "INSERT, UPDATE, REPLACE, DELETE" druga do "SELECT, SHOW", dlaczego rozdzielić? Bo inaczej się je obsługuje, w pierwszej możesz zwracać mysql_affected_rows() czy mysql_insert_id(), a w drugiej właśnie wykonać w pętli mysql_fetch_assoc() i zwrócić już tylko tablicę. Rób tak aby zamknąć wszystkie funkcje mysql_*() w tej klasie, abyś w czasie korzystania z niej, nie miał potrzeby ich używania, a jak to zrobić, staraj się jak najwygodniej dla siebie. Chwilę poużywasz, a zapewne wpadniesz na pomysł jak to zrobić lepiej. hmmm ale to w ogólnie nie wykorzystuje obiektowości.... myślałem, że to się robi jakoś inaczej, ;p No to w sumie tak jak po staremu Spokojnie, napiszesz jeden obiekt, potem będziesz mógł dalej rozszerzać. Pamiętaj aby utrzymać tę klasę jak najprostszą, potem możesz napisać co korzysta z niej i rozszerza jej możliwości. Np. zrobić metodę update() której przekazujesz id,nazwę tabeli i array( 'pole' => 'wartość' ) a ona sama tworzy SQL i robi update. Na początku zaczyna się od banalnie prostych rzeczy, potem się wchodzi w trudniejsze, tu ważne jest zrozumienie. Dlatego proponowałem, abyś skorzystał z Propel, bo najpierw byś poużywał, zobaczył jak to działa, a potem mógł zerknąć w kod i zobaczyć jak to zrobili. -------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
2.08.2008, 10:35:47
Post
#15
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
Spokojnie, napiszesz jeden obiekt, potem będziesz mógł dalej rozszerzać. Pamiętaj aby utrzymać tę klasę jak najprostszą, potem możesz napisać co korzysta z niej i rozszerza jej możliwości. Np. zrobić metodę update() której przekazujesz id,nazwę tabeli i array( 'pole' => 'wartość' ) a ona sama tworzy SQL i robi update. Na początku zaczyna się od banalnie prostych rzeczy, potem się wchodzi w trudniejsze, tu ważne jest zrozumienie. chyba zaczynam czaić o co biega Ten post edytował marekc12 2.08.2008, 10:37:00 |
|
|
2.08.2008, 10:36:25
Post
#16
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. |
Zgadzam się, Propel to najlepszy start dla kogoś, kto chce zobaczyć, jak wygląda obiektowa obsługa baz danych. Nie jest może doskonały, ale jak ktoś go "załapie", to potem samo pójdzie
-------------------- To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness; chaotic, confused, vulnerability, to inform yourself. Think for yourself. Question authority. |
|
|
2.08.2008, 10:49:00
Post
#17
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
No to zainteresuję się Propelem
hmmm czyli np. mogę to zrobić tak: klasa Babcia (metody: PołączenieZBazą, RozłączenieZBazą, WysyłanieZapytaniaPodanegoWParametrze) klasa Mama (metody: ZapisDoBazy[za pomocą funckcji w "babci": WysyłanieZapytaniaPodanegoWParametrze], OdczytZBazy[tak samo]) klasa Córka_Podstrony (metody: NowaPodstrona[z pomocą ZapisDoBazy w matce], UsunaPodstrone[z pomocą ZapisDoBazy w matce], ListaPodstron[z pomoca funkcji OdczytZBazy]) klasa Córka_Menu (metody: NowePodmenu[z pomocą ZapisDoBazy w matce], UsunMenu[z pomocą ZapisDoBazy w matce], ListaMenu[z pomoca funkcji OdczytZBazy]) oczywiście dziedziczenie: Babcia -> Mama -> Córki ;Dhehe nie za bardzo zagmatwane? dobrze to wykombinowałem ? Ten post edytował marekc12 2.08.2008, 10:56:31 |
|
|
2.08.2008, 12:39:43
Post
#18
|
|
Grupa: Zarejestrowani Postów: 1 657 Pomógł: 125 Dołączył: 29.04.2006 Ostrzeżenie: (0%) |
No to zainteresuję się Propelem hmmm czyli np. mogę to zrobić tak: klasa Babcia (metody: PołączenieZBazą, RozłączenieZBazą, WysyłanieZapytaniaPodanegoWParametrze) klasa Mama (metody: ZapisDoBazy[za pomocą funckcji w "babci": WysyłanieZapytaniaPodanegoWParametrze], OdczytZBazy[tak samo]) klasa Córka_Podstrony (metody: NowaPodstrona[z pomocą ZapisDoBazy w matce], UsunaPodstrone[z pomocą ZapisDoBazy w matce], ListaPodstron[z pomoca funkcji OdczytZBazy]) klasa Córka_Menu (metody: NowePodmenu[z pomocą ZapisDoBazy w matce], UsunMenu[z pomocą ZapisDoBazy w matce], ListaMenu[z pomoca funkcji OdczytZBazy]) oczywiście dziedziczenie: Babcia -> Mama -> Córki ;Dhehe nie za bardzo zagmatwane? dobrze to wykombinowałem ? IMO trochę za bardzo zagmatwane. Zainteresuj się wzorcem projektowym MVC -------------------- |
|
|
2.08.2008, 12:41:59
Post
#19
|
|
Grupa: Zarejestrowani Postów: 793 Pomógł: 32 Dołączył: 23.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) |
marekc12 ja Ci na prawdę dobrze radzę, teraz co powinieneś zrobić, to przerwanie wymyślania, wzięcie Propela i użycie go w paru miejscach, jak to zrobisz, wtedy wróć do wymyślania swoich pomysłów.
-------------------- Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami. |
|
|
3.08.2008, 13:30:59
Post
#20
|
|
Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 1.08.2008 Ostrzeżenie: (0%) |
IMO trochę za bardzo zagmatwane. Zainteresuj się wzorcem projektowym MVC to MVC jest trochę porypane.. tzn nie do końca czaje o co biega ;d chyba chodzi o to jak będzie zbudowany mój cms. Ja to chciałem zrobić w ten sposób(i normalnie i w panelu Admina tak samo): w index.php includuje 2 pliki: skrypty.php i widok.php. Czyli najpierw wykonuje skrypty a pozniej wyswietlam. np. w skrypty.php laczę sie z bazą, wczytuja sie podstrony do zmiennej, nie ma zadnego echo, nic nie jest wyswietlane. A w widok.php jest całe body,meta,head i tylko elementy php: echo,if,for które wyswietlaja dane ze zmiennych(np .wczytane podstrony) ze skrpyty.php. Czy tak jak ja to robie będzie nie poprawnie?? Skąd mozna sciagnać tego Propela?? Ten post edytował marekc12 3.08.2008, 13:34:02 |
|
|
Wersja Lo-Fi | Aktualny czas: 27.04.2024 - 01:50 |