![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 109 Pomógł: 9 Dołączył: 12.03.2007 Skąd: kraków/tarnobrzeg/baranów/suchorzów Ostrzeżenie: (0%)
|
Jako wynik działania tego skryptu dostajemy :
Czy ktoś wie jak wykryć referencję ? Nie wiedząc czemu ale operator === się gubi przy próbie wykrycie referencji tablicowej. |
|
|
|
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 317 Pomógł: 58 Dołączył: 6.11.2005 Ostrzeżenie: (0%)
|
Nie jestem pewny, ale w PHP chyba będzie trzeba wykrywać taką referencję już na etapie wstawiania elementów do tablicy i łapać ew. wyjątek. Najprościej chyba byłoby w ten sposób:
Oczywiście dobrze byłoby ubrać to w jakąś klasę, choć i tak nie wiem, czy taki sposób Cię urządza. Niestety nic lepszego nie przychodzi mi do głowy. |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 109 Pomógł: 9 Dołączył: 12.03.2007 Skąd: kraków/tarnobrzeg/baranów/suchorzów Ostrzeżenie: (0%)
|
Niestety to nie jest rozwiązanie mojego problemu. W skrypcie mam gotową tablicę i chciałbym wykryć taką referencję. Ma ktoś może jakiś pomysł ? Może ktoś się spotkał z podobnym problemem ?
Jak na moje oko to błąd php. Chyba trzeba będzie zgłosić bug-a. |
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%)
|
Nie wiem czemu ma służyć dublowanie w nieskończoność tablicy w tej samej tablicy. Zauważ, że var_dump($tab) pokazuje Ci zapis skrócony tablicy $tab, bo w miejscu *RECURSION* znajduje się cała tablica $tab, w której to znowu znajduje się cała tablica $tab, a w tej znowu znajduje się cała tablica $tab i tak w nieskończoność. Porównywanie za pomocą operatora === nie odnosi rezultatu, bo tych nieskończonych zagłębień jest zbyt wiele. Zresztą to i tak nie będzie sobie równoważne, bo w $tab znajduje się jedna referencja więcej, aniżeli w $tab['ref']. Przy takiej budowie tablicy $tab "wywali" się każda funkcja przeszukująca tablicę w głąb, nie tylko operator ===. Nie sprawdzałem, ale śmiem twierdzić, że nie tylko w PHP taka funkcja się "wywali".
Jednakże jest sposób na sprawdzenie, czy jedna tablica jest referencją drugiej:
Ten post edytował mortus 8.09.2011, 07:31:53 |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 30 Dołączył: 5.05.2007 Skąd: Mannheim Ostrzeżenie: (0%)
|
Witam !
Na moje oko nie jest to blad PHP - tylko blad logiczny w budowie tablicy. Przeciez umieszczajac jako element tablicy jej referencje do samej siebie, tworzysz niekonczacy sie rekursywny twor. Zroc uwage ze $tab['ref'] = &$tab znaczy dokladnie tyle ze element $tab['ref'] zawiera referencje do tablicy $tab, ktorej z kolei ostanim elementem jest $tab['ref'], ktory zawiera referencje do $tab i tak w kolko. To szczescie ze PHP w inteligentny sposob wykrywa to zapetlenie i wyrzuca ci error, anie zawiesza kompa. (IMG:style_emoticons/default/wink.gif) Poprobuj tego numeru z innymi jezykami, to bedziesz musial wtyczke z kontaktu wyciagac, zeby kompa wylaczyc (IMG:style_emoticons/default/biggrin.gif) Pozdrawiam Ten post edytował zbig 8.09.2011, 07:32:51 |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 109 Pomógł: 9 Dołączył: 12.03.2007 Skąd: kraków/tarnobrzeg/baranów/suchorzów Ostrzeżenie: (0%)
|
@mortus - Twoja metoda ma wadę. Otóż zmienia stan tablicy którą sprawdzamy za pomocą tej funkcji. Lepiej chyba generować unikalny klucz co do którego mamy pewność że nie istniej (po to aby nie nadpisać żadnej wartości) w tej tablicy i po wykonaniu porównania zawsze go usunąć (obecnie usuwasz wartość testową tylko w jednym odgałęzieniu).
Ale ogólnie koncepcja jest dobra (IMG:style_emoticons/default/smile.gif) @zbig - To nie jest kwestia tego że chcę tworzyć taką tablicę. Ba, wolałbym żeby takiej referencji w ogóle się nie udało utworzyć. No ale skoro już da się ją utworzyć to php powinno dostarczać mechanizmów za pomocą których będzie można wykryć taki przypadek. piszesz że : Na moje oko nie jest to blad PHP - tylko blad logiczny w budowie tablicy. W takim razie uruchom sobie : Jako wynik otrzymasz :
To nie jest błąd budowy tablicy. To jest po prostu referencja. W przypadku obiektów też możesz mieć zmienną klasy która wskazuje np. na this-a. Wtedy to też jest błąd logiczny ? Moim zdaniem to tylko zmienna która przyjmuje taką wartość. Może napiszę do czego to ma mi służyć. Otóż przy raportowaniu błędu chcę sobie zrobić jednocześnie zrzut ze zmiennych globalnych. Wiadomo, nie powinno się używać ale jeśli ten error_handler ma zostać użyty do zdiagnozowania problemu w jakimś skrypcie obcego pochodzenia to taka informacja może się bardzo przydać. To właśnie przy raportowaniu zmiennej $GLOBALS spotkałem się z tą referencją uporczywą. Ten post edytował szagi3891 9.09.2011, 07:04:29 |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 144 Pomógł: 30 Dołączył: 5.05.2007 Skąd: Mannheim Ostrzeżenie: (0%)
|
Witam kolego ponownie!
Zwracam honor. Faktycznie w tablicy global jest referencja do samej siebie. Co nie zmienia faktu, ze mam na ten temat swoje zdanie. Tutaj masz prawdopodobnie rozwiazanie twojego problemu http://www.php.net/manual/en/language.references.spot.php Pozdrawiam |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%)
|
@mortus - Twoja metoda ma wadę. Otóż zmienia stan tablicy którą sprawdzamy za pomocą tej funkcji. Lepiej chyba generować unikalny klucz co do którego mamy pewność że nie istniej (po to aby nie nadpisać żadnej wartości) w tej tablicy i po wykonaniu porównania zawsze go usunąć (obecnie usuwasz wartość testową tylko w jednym odgałęzieniu). Masz rację co do unikalności klucza, jednak już nie masz racji co do usuwania wartości testowej. Skoro jedna z tablic jest referencją (powiązaniem) z drugą, to usunięcie elementu z jednej skutkuje usunięciem elementu z drugiej. Rozwiązania nieco bardziej rozbudowane od mojego znajdują się w miejscu, które wskazał zbig. |
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 109 Pomógł: 9 Dołączył: 12.03.2007 Skąd: kraków/tarnobrzeg/baranów/suchorzów Ostrzeżenie: (0%)
|
Istotnie bardzo dobry link. Tylko teraz nasuwa się pytanie czy php czy przypadkiem działania operatora === w przypadku wykrywania referencji nie powinno się traktować jako błędu.
|
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%)
|
Operator === nie służy do wykrywania referencji, tylko do porównywania typów i wartości zmiennych. Problemem w tym przypadku nie jest referencja, tylko zbyt duże zagłębienie tablicy. By porównać dwie takie tablice operator === musi je po prostu "rozwinąć" i na to nie starcza mu pamięci (i nigdy nie wystarczy), stąd błąd z komunikatem o zbyt dużej liczbie zagłębień. Zauważ, że to działa już prawidłowo:
Gwoli uzupełnienia co do stwierdzenia: Cytat Skoro jedna z tablic jest referencją (powiązaniem) z drugą, to usunięcie elementu z jednej skutkuje usunięciem elementu z drugiej. Referencja to nic innego, jak wskazanie w pamięci miejsca, które my rozpoznajemy po nazwie zainicjowanej wcześniej zmiennej. Usunięcie tej zmiennej to "wyczyszczenie" tego miejsca w pamięci. Usunięcie referencji skutkuje usunięciem zmiennej, ponieważ operujemy na tej samej "komórce" pamięci. |
|
|
|
![]() ![]() |
|
Aktualny czas: 22.12.2025 - 19:19 |