![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 476 Pomógł: 1 Dołączył: 5.11.2005 Skąd: Bieruń city Ostrzeżenie: (0%) ![]() ![]() |
mam przykładowo taki kod:
spodziewałem się takiego efektu: Cytat die B --- die A czyli unset niszczy $b, następnie wyświetlane są "---" i wraz z końcem skryptu usuwany jest obiekt $a. tymczasem wynik jest taki: Cytat --- die A die B unset w ogóle nie działa. może mi ktoś powiedzieć jak usunąć obiekt $b? z góry dziękuje za odpowiedź. EDIT: $foo musi być prywatna Ten post edytował dtb 15.02.2010, 19:25:26 -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Unset usuwa tylko referencję do do zmiennej, a nie samą zmienną. Pamięć jest zwalniana gdy na daną zmienną nie wskazuje już żadna referencja (np. gdy usunięta zostanie ostatnia referencja). W Twoim kodzie istnieje jeszcze referencja do obiektu $b w obiekcie $a i dlatego obiekt $b nie został usunięty (nie wywołał się destruktor).
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 24 Dołączył: 18.01.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
efekt Kod die B --- die A
efekt Kod die B
--- die A die B -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
-=Peter=- wyjaśnił dlaczego dzieje się tak, a nie inaczej.
Pr0100 wyjaśnił jak można to obejść. Ja od siebie dodam kod, który to zobrazuje istotę problemu.
Wynik: Cytat B::__destruct --- A::__destruct Zostaje nadal problem samych destruktorów i czy warto ich używać. Kilka miesięcy temu, ktoś poruszył podobny temat i tutaj masz link do tych kilku zdań, które wtedy napisałem. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 476 Pomógł: 1 Dołączył: 5.11.2005 Skąd: Bieruń city Ostrzeżenie: (0%) ![]() ![]() |
klonowanie, ani rozwiązanie LBO absolutnie nie wchodzi w grę.
LBO: destruktorów tu użyłem jedynie do debugowania i aby zobrazować problem. dzięki pr0100: próbowałem wcześniej z =&, a miało być &=. -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
dzięki pr0100: próbowałem wcześniej z =&, a miało być &=. muszę Cię jednak rozczarować ![]() ![]() $a &= $b oznacza $a = $a & $b unset usuwa tutaj tylko referencję - obiekt jest niczszony po zniszczeniu ostatniej możliwej referencji... i tu swoją drogą logikę jaką chcesz uzyskać jest dla mnie troszku nie zrozumiała - skoro obiekt A potrzebuje obiektu B to obiekt B powinien zostać zniszczony na końcu tak jak się to dzieje - a w php 5 każdy obiekt domyślnie jest przekazywany przez referencję... jest sposób na obejście tego ale do sklepu się śpieszę - jak wrócę pomyślę ![]() Ten post edytował zegarek84 16.02.2010, 21:10:38 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 476 Pomógł: 1 Dołączył: 5.11.2005 Skąd: Bieruń city Ostrzeżenie: (0%) ![]() ![]() |
nigdzie nie powiedziałem, że obiekt A potrzebuje B. wręcz przeciwnie. w moim projekcie A (nazwijmy go WINDOW) i B (BUTTON) są widgetami. BUTTON samodzielnie nie może być wyświetlony, potrzebuje do tego WINDOW, który wyświetli widgety na nim. chodzi o to, by można było np. usunąć BUTTON - wtedy destruktor wyśle informacje do klienta (ajax), aby usunąć widget. rozwiązanie LBO jest nieintuicyjne i niewygodne w przypadku bardziej rozbudowanej hierarchii, jak np. WINDOW > TABLE > TOOLBAR > BUTTON.
warto wspomnieć, że nazwa zmiennej, jest jednocześnie unikalnym id widgetu przez który się odwołuje do niego. czyli nie: $window1->table1->toolbar1->button1, tylko samo $button1. zdziwiło mnie rozwiązanie z &=, ale działa tak jak oczekiwałem. Ten post edytował dtb 21.02.2010, 19:39:24 -------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Już drugi raz wyskakuje mój nick, dlatego, czy mogę się zapytać Ciebie @dtb, co dokładnie uważasz za moje rozwiązanie?
1. Mój poglądowy kod? Bo to nie miało służyć jako żadne rozwiązanie, tylko wyjaśnić problem. Cytuję: "Ja od siebie dodam kod, który to zobrazuje istotę problemu.". Dam coś prostszego:
2. Koncepcję z linku który podałem? Bo w życiu nie nazwałbym go nieintuicyjnym, ani niewygodnym. Szczerze? Nie wyobrażam sobie, abyś nie użył analogicznego rozwiązania do Twojego WINDOW > TABLE > TOOLBAR > BUTTON. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 476 Pomógł: 1 Dołączył: 5.11.2005 Skąd: Bieruń city Ostrzeżenie: (0%) ![]() ![]() |
ech... niepotrzebnie zaczynałem dyskusję.
przyczepiłem się tego, bo myślałem, że to proponowane przez Ciebie rozwiązanie (mój błąd - źle przeczytałem): Kod $a->unsetB(); unset($b); takie rozwiązanie oczywiście nie pasuje, bo załóżmy że mam więcej obiektów wrzuconych do $a: Kod $a->assign($button1 = new B); $a->assign($button2 = new B); $a->assign($button3 = new B); $a->assign($foo = new B); ich liczba nie jest określona. jak bym chciał usunąć obiekt $button3, to nie mogę przecież utworzyć metody unsetButton3 (i tak dla każdej potencjalnej nazwy zmiennej). to było by bez sensu. natomiast zaproponowany przez ciebie system zarządzania obiektami nie jest rozwiązaniem jakiego oczekuje, ponieważ nie chodzi mi o kolejność wykonywania destruktorów, a jedynie o możliwość usunięcia pojedynczej instancji wraz z wszystkimi jej referencjami w dowolnym miejscu w kodzie. widać źle zrozumiałeś moje intencje na samym początku. Ten post edytował dtb 22.02.2010, 01:19:15 -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
[...] ich liczba nie jest określona. jak bym chciał usunąć obiekt $button3, to nie mogę przecież utworzyć metody unsetButton3 (i tak dla każdej potencjalnej nazwy zmiennej). to było by bez sensu. [...] Masz kilka opcji: 1. Bawisz się w klonowanie. Wtedy zużycie pamięci może skoczyć pod sufit, a to może boleć. 2. &= naprawdę nie działa. Zdebuguj to sobie dokładnie. 3. Bawisz się rozwiązaniem z linku. Nie ma ono za zadanie tylko zastępować destruktorów, ono ma zarządzać obiektami. Wymaga to więcej pracy i planowania, ale jest do zrobienia.
Nie powinno być:
[...] to było by bez sensu. Nie, jak będziesz miał coś w stylu:
Wszystko rozbija się o abstrakcję. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.07.2025 - 17:03 |