Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Usuwanie zmiennej, na którą wskazuje referencja.
Pax95
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 7
Dołączył: 31.01.2009

Ostrzeżenie: (0%)
-----


Mam kod:
  1. public function offsetUnset( $offset )
  2. {
  3. $segments = explode( ".", $offset );
  4. $configPointer = &$this->config;
  5. foreach ( $segments as $segment )
  6. $configPointer = &$configPointer[$segment];
  7. }


Instrukcja unset( $configPointer ) spowoduje usunięcie referencji, zamiast elementu tablicy na jaki wskazuje.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
lDoran
post
Post #2





Grupa: Zarejestrowani
Postów: 172
Pomógł: 13
Dołączył: 15.11.2009

Ostrzeżenie: (0%)
-----


O ile dobrze się orientuję to referencja jest usuwana w momencie końca życia obiektu.
  1. $tab1 = $tab2;

Tworzy automatycznie referencję do tablicy i każda zmiana w $tab1 powoduje zmianę w $tab2, w związku z tym logiczne jest, że usuwając zmienną $tab1 usuwasz tablicę $tab2(czytaj zwalniasz miejsce w pamięci).
Go to the top of the page
+Quote Post
Pax95
post
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 7
Dołączył: 31.01.2009

Ostrzeżenie: (0%)
-----


Nawet jeśli referencja do tablicy tworzona jest bez użycia operatora wyłuskania (&), to założę się, że już do jej elementów tworzone będą kopie, zamiast referencji, więc mimo to jestem w kropce.
Go to the top of the page
+Quote Post
lDoran
post
Post #4





Grupa: Zarejestrowani
Postów: 172
Pomógł: 13
Dołączył: 15.11.2009

Ostrzeżenie: (0%)
-----


Logiczne jest, że jeżeli $x jest referencją $y to $x wskazuje na miejsce w pamięci zajmowane przez $y. Jeżeli usuniesz miejsce w pamięci na które wskazuje $x usuniesz zmienną $y, ponieważ obie 'zmienne' korzystają z tego samego miejsca w pamięci.

EDIT:
W ogóle nie rozumiem jaki masz cel w kodzie tworząc referencję referencji(linia 4 i 6 na moje oko wskazują na to samo)
  1. public function offsetUnset( $offset )
  2. {
  3. $segments = explode( ".", $offset );
  4. $configPointer = &$this->config;
  5. foreach ( $segments as $segment )
  6. $configPointer = &$configPointer[$segment];
  7. }


Ten post edytował lDoran 2.11.2010, 14:18:33
Go to the top of the page
+Quote Post
Pax95
post
Post #5





Grupa: Zarejestrowani
Postów: 50
Pomógł: 7
Dołączył: 31.01.2009

Ostrzeżenie: (0%)
-----


Jeśli jest kod:
$x = &$y;
To chcę usunąć wartość zmiennej $x mając do dyspozycji tylko $y.

Co chcę uzyskać? W klasie mam postrzępioną tablicę i chcę się do niej odwoływać przez:
$config["klucz1.klucz2.klucz3"], gdzie $config przechowuje obiekt implementujący ArrayAccess.
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Instrukcja unset( $configPointer ) spowoduje usunięcie referencji, zamiast elementu tablicy na jaki wskazuje.

Teoretycznie, nieistniejąca zmienna, to jest - innymi słowy - null.

unsetem kasujesz referencję. PHP, niestety, nie ma operatora, który by pozwolił uzyskanie bezpośredniego adresu do zmiennej, na którą wskazuje referencja. Ale czemu by nie ustawić jej na null? (IMG:style_emoticons/default/winksmiley.jpg) Też będzie zachowywać się jak usunięta, patrząc do dokumentacji dla isset:
Cytat
isset() will return FALSE if testing a variable that has been set to NULL

Czyli wydaje mi się, że moje myślenie jest prawidłowe. [;
Go to the top of the page
+Quote Post
Pax95
post
Post #7





Grupa: Zarejestrowani
Postów: 50
Pomógł: 7
Dołączył: 31.01.2009

Ostrzeżenie: (0%)
-----


Miałem taki pomysł, a potem wywalać puste elementy, ale ostatecznie skorzystałem z eval(). Dzięki wszystkim za fatygę.
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
ale ostatecznie skorzystałem z eval()

Akysz! Po co Ci eval?
Go to the top of the page
+Quote Post
Pax95
post
Post #9





Grupa: Zarejestrowani
Postów: 50
Pomógł: 7
Dołączył: 31.01.2009

Ostrzeżenie: (0%)
-----


Zamieniam klucz1.klucz2.klucz3 na [klucz1][klucz2][klucz3] i doczepiam do zmiennej.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 20:32