Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z wykryciem referencji pomiędzy tablicami., Fatal error: Nesting level too deep - recursive dependency
szagi3891
post
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%)
-----


  1. $tab = array();
  2.  
  3. $tab['zm'] = 'val';
  4. $tab['ref'] = &$tab;
  5.  
  6. print '<pre>';
  7.  
  8. var_dump($tab);
  9. print '<hr/>';
  10.  
  11. var_dump($tab['ref'] === $tab);
  12. print '<hr/>';


Jako wynik działania tego skryptu dostajemy :

  1. array(2) {
  2. ["zm"]=>
  3. string(3) "val"
  4. ["ref"]=>
  5. &array(2) {
  6. ["zm"]=>
  7. string(3) "val"
  8. ["ref"]=>
  9. *RECURSION*
  10. }
  11. }
  12.  
  13. Fatal error: Nesting level too deep - recursive dependency? in /home/szagi3891/ftp/baselib_site/ciemnia2.notatki.info/_error/ref.php on line 14


Czy ktoś wie jak wykryć referencję ? Nie wiedząc czemu ale operator === się gubi przy próbie wykrycie referencji tablicowej.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
szagi3891
post
Post #2





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 :
  1. print '<pre>';
  2. print_r($GLOBALS);
  3. print '</pre>';
  4. exit();


Jako wynik otrzymasz :
  1. (
  2. [GLOBALS] => Array
  3. *RECURSION*
  4. [_POST] => Array
  5. (
  6. )
  7.  
  8. [...]
  9.  
  10. [_SERVER] => Array
  11. (
  12. [HTTP_HOST] => 127.0.0.1
  13. [HTTP_CONNECTION] => keep-alive
  14. [HTTP_REFERER] => [url="http://127.0"]http://127.0[/url].


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
Go to the top of the page
+Quote Post
mortus
post
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Cytat(szagi3891 @ 9.09.2011, 08:04:00 ) *
@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.
Go to the top of the page
+Quote Post

Posty w temacie


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: 26.12.2025 - 06:39