![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 35 Pomógł: 5 Dołączył: 13.07.2008 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Na wstępie krótki opis. Nie chce korzystać z singletona do klas typu db, session, input etc. I prawdopodobnie tutaj znajduje się mój problem. Mianowicie chodzi o klasę obsługi sesji, która wygląda mniej więcej tak (jest to szablon skrótowy - naprawdę ma połączenie z bazą danych i zapisuje dane do niej a nie do $_SESSION):
Nie przedstawiłem pozostałej części metod, gdyż nie mają wpływu na dalsze zachowanie. Jak już wspomniałem ma także połączenie z bazą danych. Nie napisałem jeszcze o session_handler, który tam się znajduje, jednakże on służy do zapisu danych do bazy. I tutaj pojawia się problem. Przy pojedynczym wywołaniu obiektu i operacjach na nim wszystko gra, jednakże jeżeli wywołuję obiekt w różnych klasach pojawia się problem - dane są często nadpisywane lub kasowane przez domyślne. Zastanawiam się dlaczego - operuje na danych typu static, czyli każdy obiekt powinien mieć do nich dostęp. Przez debugowanie zauważyłem że dane istnieją, jednakże pod samym końcem (wywoływanie ostatniego destruktora przez silnik PHP kasuje większość danych). Czy ktokolwiek z Was miał już podobny problem? Nadmieniam że jeżeli ustawię zapis sesji na native problem cały czas występuje. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie chcesz tworzyć singletona, a tak naprawdę tworzysz coś podobnego do niego, ale wg mnie w gorszy, bardziej "tandetny" sposób. Nie wiem, czy dobrze zrozumiałem Twój problem i czy Ty dobrze rozumiesz ideę destruktorów, więc dla jasności napiszę:
Problemem jest to, że dane na końcu zostają utracone? Nie mogę zreprodukować tego błędu więc nie pomogę w tej kwestii, ale wg mnie naprawdę przekombinowałeś z tą klasą (nowy wzorzec projektowy? (IMG:style_emoticons/default/tongue.gif) ). Użyj singletona (nie najlepszy pomysł), albo wsadź sesję do jakiegoś rejestru (trochę lepszy), wstrzykuj ją tam gdzie jest potrzebna (trochę roboty z tym jest) lub zrób z niej klasę całkowicie statyczną. Ostatnią opcję poprę przykładem:
Tylko jeśli użyjesz klasy statycznej, to sam musisz zadbać o rozpoczęcie sesji (Session::init()) oraz o jej zamknięcie (Session::shutdown()), co jednak nie powinno być jakimś wielkim problemem. Ten post edytował -=Peter=- 19.08.2009, 16:53:07 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 35 Pomógł: 5 Dołączył: 13.07.2008 Skąd: Kalisz Ostrzeżenie: (0%) ![]() ![]() |
Dzięki, poradziłem sobie w inny sposób - zrezygnowałem z destruktora, duża część osób, nawet tworzących PHP nie ma pojęcia dokładnie jak działa i dlaczego czasami inaczej.
Dodałem zdarzenie na zakończenie wykonywania skryptu, które wywołuje metodę zapisu do bazy danych, niezależnie od ilości klas. Problem ten powstawał gdy klasa tworzona była wielokrotnie w różnych klasach - destruktor nie działał wg stosu tylko hmm... dziwnie (IMG:style_emoticons/default/winksmiley.jpg) Co do tego tworzenia klasy (nie singleton) - przydaje się w różnych IDE - spróbuj utworzyć obiekt przez np ::getInstance() i potem pomoc w 'dymkach' nie pojawia się i nie przedstawia metod i wartości publicznych klasy. Poza tym zauważyłem że ten sposób używają także programiści Frameworka Kohana. No ale to już są argumenty na poziomie wyższości Bożego Narodzenia nad Wielkanocą. Dzięki za odpowiedź. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Destruktor jest wykonywany na końcu, czyli po wywołaniu wszystkich metod z klasy, nie wiem co Ty rozumiesz przez stos, ale ja rozumiem ściąganie wartości z "stosu" np siana, do końca, po ostatnim wywołaniu jest wywoływany argument. Amen. Możesz sobie tworzyć instancje klasy w innych klasach, co jest mega głupotą, a każde budowanie pseudo singletona == utworzenie singletona === idiotyzm! Nie lubie singletona, referencje do obiektu, no bez jaj, co to za pomysł chory... Jak i ten Wasz cały chory polimorfizm, gdyby nie było klas abstrakcyjnych we odbyt moglibyście sobie wsadzić ten polimorfizm w php.
Jak mi ktoś napisze że polimorfizm by stosował na klasach to go chyba śmiechem zabije. Ten post edytował cojack 22.08.2009, 23:54:20 |
|
|
![]()
Post
#5
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat Destruktor jest wykonywany na końcu, czyli po wywołaniu wszystkich metod z klasy Po usunięciu ostatniej referencji do klasy, wywoływanie metod w klasie nie ma nic do tego. (IMG:style_emoticons/default/tongue.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Referencja, odwołanie, odwołanie wywołanie metody, zasada hermetyzacji -> metody dostępowe, ew __set i __get. No to jak?
Brakuje mi technicznego języka, wyrobie się ;] @down No to taki kruczek ;] Ten post edytował cojack 24.08.2009, 13:42:29 |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat czyli po wywołaniu wszystkich metod z klasy Z Twojej wypowiedzi zrozumiałem tak, że destruktor jest wykonywany po wywołaniu wszystkich metod po kolei, z danej klasy. (IMG:style_emoticons/default/tongue.gif) Podejrzewam, że nie tylko ja. |
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Ja akurat rozumiem ideę destruktora aż za dobrze, bo siedziałem w C++ trochę dłużej i tam nieraz go definiowałem i w PHP także to robię. Najprościej mówiąc:
"Destruktor to metoda klasy wywoływana w momencie gdy obiekt klasy ma zostać usunięty z pamięci procesu - jawnie bądź nie." Takie rozumienie pozwala zaważyć, że nie jest ważne jak obiekt ginie. Czy nakazujemy mu to w sposób jawny, w momencie uruchomienia garbage collectora czy też gdy skrypt się kończy to i tak tuż przed tym momentem jest on wywoływany. Polimorfizm w pewien sposób dla PHP jest bezsensowny, gdyż jego podstawowe działanie jest związane ze znajomością typu, a poza Object i Array trudno ustalić co tak naprawdę jest w zmiennej bo konwersja typów następuje w locie najczęściej i nie możemy na tym polegać tak jak w językach silnie stypizowanych. Destruktora nie ma co ruszać jeśli nie działasz w konstruktorze w sposób mogący wpływać na stabilność lub inne instancje tej samej klasy. Najpowszechniejsze zastosowanie to użycie w momencie gdy przypisałeś obiektowi pamięć w konstruktorze w sposób niestandardowy lub oddziaływanie na wartości statyczne klasy. Chyba najprostszy przykład to licznik obiektów klasy. W konstruktorze go zwiększasz o 1, a w destruktorze zmniejszasz o 1. W ten sposób zawsze znasz dokładną ilość "żyjących" obiektów klasy w danej chwili. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 11:44 |