![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 31.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
Klasa 1
Klasa 2
Klasa 3
Klasa 1 jest odpowiedzialna za połączenie się z bazą danych Klasa 2 w domyśle weryfikuje dane wprowadzone przez użytkownika, Klasa 3 wprowadza operacje na danych, tworzy hasło, unikatowy kod do weryfikacji przez email, dodawanie użytkownika do bazy, edycje itp Mam problem ze zrozumieniem zasięgu zmiennych, metod, obiektów itp. Wiem, co znaczy private, public, protected ale ciężko jest mi ogarnąć to w praktyce, pisze to w przedszkolu gdyż bardzo krótko programuję a jeszcze krócej w PHP, nie chce być tu karcony przez stwierdzenia typu zrób jakiś kurs albo poczytaj książkę, gdyż do takich rozwiązań już sięgałem, rozumiem iż metodą prób i błędów człowiek uczy się najwięcej ale czy ktoś mógłby mi wytłumaczyć jak działa się i jak powinno działać się.... Klasa 1 łączy z bazą, gdy w Klasie 3 chce coś dodać do bazy to w konstruktorze wywołuję połączenie $this->pdo = Database::getDB(); Podobnie chciałbym w metodzie test() użyć metody z Klasy 2, jak powinienem to zrobić ? Powyższy kod działa poprawnie, ale moje pytanie jest takie czy muszę za każdym razem w metodzie tworzyć nowy obiekt danej klasy jeżeli chcę metodę wykorzystać z innej klasy? Da się tworzyć jakoś obiekt w konstruktorze? Zaznaczę, że połączenie z funkcją statyczną w klasie 1 w klasie 3 jest wykonane poprawnie, podczas gdy nie mam możliwości tworzenia obiektów klasy 2 w konstruktorze klasy 3 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 282 Pomógł: 89 Dołączył: 12.04.2011 Ostrzeżenie: (0%) ![]() ![]() |
Metody statyczne właśnie po to są, by wywoływać je bez potrzeby tworzenia obiektów danej klasy.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ok przede wszystkim nie uczmy złych praktyk (IMG:style_emoticons/default/smile.gif)
Metody/własności statyczne są wygodne owszem ale przy większym projekcie i jego zarządzaniu okazują się zbyt mało "organizowalne" - zbyt prosto się do nich odwołać (są też mniej wydajne) przez co powstają złe nawyki. Najpierw co do samego zasięgu. - public - oznacza, że dana metoda/własność jest widoczna poza ciałem klasy - są to naogół metody i własności główne (te najważniejsze) danej klasy. Ich liczbę powinno się ograniczyć maksymalnie do liczby czynności jakie dana klasa ma realizować. W zasadzie poprzez HERMETYZACJE (zobacz sobie co to jest w OP) nie powinno się stosować publicznych własności klasy - powinny być do nich tzw. gettery i settery - po co to wszystko - poczytaj o tym - zrozumiesz ile to daje (IMG:style_emoticons/default/wink.gif) - private - to metody i własności, które nie muszą być dostępne na zewnątrz jakiejś klasy. Są one używane wewnątrz. Nieraz tworząc jakąś klasę wykonującą dużo czynności zajmuje ona dużo kodu - aby nie umieszczać go w jednej metodzie można go funkcjonalnie rozdzielić na metody prywatne, wykorzystywane w głównych metodach publicznych klasy. - protected - to to samo co private lecz pozwala na dziedziczenie. Możesz zrobić sobie klasę z zestawem metod chronionych (protected) i potem kolejną klasę dziedziczącą z tej właśnie. Dzięki temu możesz utworzyć kilka różnych klas dziedziczących po tej jednej, która ma metody wykrozystywane we wszystkich. To wszystko co napisałem można zastąpić metodami i własnościami statycznymi - nawet wydaje się to łatwiejsze. Niestety tak się robić nie powinno - gubi się wówczas ładną, poukładaną i logiczną strukturę aplikacji - nie mówiąc o wydajności (odwołania statyczne są sporo wolniejsze od dynamicznych). Masz 3 klasy. 1sza jest ok - połączenie z DB - tu nie mam zastrzeżeń. 2ga i 3cia wymaga zastanowienia. Czy jest to klasa, która będzie używana w wielu miejscach? Czy będzie miała więcej metod walidacyjnych? Jeśli tak to zrób inaczej i nie twórz w klasie 3ciej instancji 2giej. Niech klasa 3cia dziedziczy po 2giej. Wówczas masz od razu gotową metodę, którą możesz wywołać lokalnie bez powoływania obiektu klasy drugiej. Nie podpowiadam więcej - przemyśl to (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 31.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
Czytałem już wcześniej o __set i __get i na pewno będę chciał tak pisać, ale puki co jak sam widzisz mam takie "życiowe" problemy z oop że nie chcę dokładać do pieca. Wcześniej już robiłem aby klasa uzytkownik była dzieckiem weryfikacja ale nie wiem czemu nie działało mi, widocznie miałem jeszcze coś więcej pokićkane, w tym układzie jak jest teraz sprawdza się to i nie muszę tworzyć nowego obiektu klasy weryfikacja tylko odwołuje się od razu $this-> do danej metody.
Twoje pytanie odnośnie czy to coś więcej będzie robiło, to stwierdziłem że zrobię klasę weryfikacja bo przyda się przy rejestrowaniu, zmianie hasła, maila, może użyje przy dodawaniu czegoś przez użytkownika jakiś wpisów do sprawdzania, w tej klasie chciałem umieścić metody do sprawdzania danych wprowadzanych przez użytkownika. Co do klasy uzytkownik, to po prostu chciałem zrobić prostą rejestrację i tworząc klasę zacząłem zastanawiać się nad tym dlaczego nie mogę użyć danej metody (skoro jest public) i czy wszędzie muszę tworzyć obiekt. Jeszcze jedno pytanie: Jak powinno się pisać klasy do obsługi bazy danych, w sensie, jeżeli mam portal to są klasy odpowiedzialne za różne rzeczy, to tworzę JEDNĄ klasę która np dodaje do bazy i edytuje w niej wpisy itp? Wiem, że można to robić na wiele sposobów ale chodzi mi o dobrą praktykę. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
settery i gettery to nie magiczne metody __set i __get - tu trochę mylisz pojęcia. Chodzi o zapis typu:
Te metody, które wymieniłeś służą do czegoś innego - do obsługi odwołań do nieistniejących własności obiektu. Przeczytaj coś o hermetyzacji - to Ci dokładnie wytłumaczy jak i po co to stosować. Co do układu klas to jest ok - jeśli będziesz używał tej "weryfikacji" w wielu miejscach to dziedziczenie będzie chyba najlepszym pomysłem właśnie. Co do pytania to odpowiedź jest prosta: MODELE Ogolnie aplikacje (kod) można podzielić na 3 oddzielne części wg architektury zwanej MVC - na początek może nie zaglębiaj się w nią bo ciężko ją na początku zrozumieć. W skrócie chodzi o to by rozdzielić zarządzanie danymi od zarządzania żądaniami (przekazywanie parametrów pod podany adres, wybór odpowiedniej strony itp.) i od warstwy prezentacji. Dzieli się to na kontroler, model i widok (Model-View-Controller). Weź sobie z tego model. Model to klasa dotycząca (najczęściej) jakieś tabeli w bazie danych. Przykładowo masz tabele z użytkownikami (powiedzmy users). Tworzysz więc klasę modelu "users" albo "usersModel". W tej klasie implementujesz metody, które robią coś z użytkownikami - dodają, zapisują po edycji, kasują, pobierają z DB. W innej klasie (modelu) możesz obsługiwać inne tabele. Cel tutaj jest taki aby tabela miała swój odpowiednik w kodzie w formie klasy. Robiąc później klasę rejestracji nie implementujesz w niej zapytań SQL itp. a odwołujesz się do konkretnych metod konkretnych modeli. Możesz więc zrobić metodę rejestracja, w niej walidować dane a potem przekazać je do odpowiedniej metody (np.: "dodajUzytkownika(...)") modelu "users". Sam dostęp do bazy TY oparłeś na PDO i wzbogaciłeś to o klasę, ktora jest globalnie dostępna (poprzez odwołanie statyczne aby nie tworzyć wielu połączeń) i to tak może zostać. Tą klasę używaj w modelach. Z modelami wiąże się pewien problem - co zrobić a raczej, do którego modelu dodać metodę zwracającą jakieś łączne dane z wielu tabel bądź pracującej na wielu tabelach naraz. To jest kwestia indywidualna. Ogólnie są dwie ścieżki: 1. Metoda zostaje wrzucona do modelu po tym co zwraca. Oznacza to, że jeśli metoda pobiera na przykład produkty klienta to wrzucasz ją do modelu produktów bo ich listę będzie zwracać. 2. Metoda zostaje wrzucona do modelu po tym co przyjmuje. To z kolei oznacza, że metoda trafi do tego modelu, którego dotyczą dane (argumenty) wejściowe tej metody. Czyli jeśli pobieramy produkty klienta to podajemy w metodzie o jakiego klienta nam chodzi - więc metoda ta powinna trafić do modelu klientów. Oba podejścia są dobre i najczęściej występują mieszanie. Staraj się jednak trzymać jednej - osobiście polecam 2gą - jest bardziej intuicyjna. Tak to wygląda w kodzie:
Wybór należy do Ciebie - co dla Ciebie jest bardziej intuicyjne to wybierz (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 31.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
Dobry człowieku, Ty to masz do mnie cierpliwość (nie to żebym się żalił) (IMG:style_emoticons/default/smile.gif)
Z tego co napisałeś zrozumiałem tyle:
Czy można robić to jako w konstruktorze? Wymusza to podawanie 3 wartości przy tworzeniu nowego obiektu. Czy lepiej napisać specjalną metodę na settowanie, która będzie wywoływana w addUser ? Ten post edytował hunter1988 3.06.2013, 11:26:32 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Może być tak (prawie) - co prawda myślałem nad tym by model nie walidował danych ale może w sumie. Ja to ogólnie widzę bardziej tak:
Tak jak Ci napisałem najlepiej nic nie kombinować i podać dane metodzie których potrzebuje (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 31.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
I już więcej nie męczę, dla upewnienia.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) ![]() ![]() |
Wygląda ok, co prawda w PDO jeszcze inaczej można przekazywać wartości, ale nie o tym.
Staraj się nie mieszać angielskiego z polskim. $weryfikacja = new Weryfikacja; $data_rejestracji = time(); tu masz w pełni po polsku, a tutaj już: $weryfikacja->checkMail(...) pomieszane trochę, co nie wygląda na dobre. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 31.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
Wygląda ok, co prawda w PDO jeszcze inaczej można przekazywać wartości, ale nie o tym. Staraj się nie mieszać angielskiego z polskim. $weryfikacja = new Weryfikacja; $data_rejestracji = time(); tu masz w pełni po polsku, a tutaj już: $weryfikacja->checkMail(...) pomieszane trochę, co nie wygląda na dobre. A powiem Ci że w momencie w którym wklejałem to sam o tym pomyślałem, lepiej trzymać się jednej koncepcji, fakt! |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Dla uproszczenia kod:
Można zamienić na:
1. Dwukropek przy bindowaniu jest niepotrzebny 2. ::bindValue domyślnie ma 3 argument jako PDO::PARAM_STR 3. można użyć skróconej formy poprzez podanie tablicy parametrów do execute (IMG:style_emoticons/default/wink.gif) Twoja metoda aczkolwiek jest o wiele dokładniejsza - więc może tak zostać jak najbardziej - wiedz jednak, że da się inaczej (IMG:style_emoticons/default/wink.gif) |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 0 Dołączył: 31.05.2013 Ostrzeżenie: (0%) ![]() ![]() |
Dobrze wiedzieć, warto ogólnie rozumieć co się wykorzystuje i co jest domyślnie aby unikać błędów i niepotrzebnego kodu, jednak zostanę przy tym jak mam, na pewno będzie to rozsądniejsze dla początkującego jak będę używał pełnych rozwiązań, wtedy widzę co gdzie i dlaczego mogę zmienić, aczkolwiek dziękuję po raz kolejny za pomoc (IMG:style_emoticons/default/wink.gif)
Ps. dziś rozmawiam z kolegą i mówię mu, że znalazł się pomocny użytkownik na forum i ruszyłem trochę, więc szykuje się flaszka kurierem (IMG:style_emoticons/default/biggrin.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 28.09.2025 - 13:41 |