Posts Tagged ‘php’

PHP Fehler Schachtelungsebene Too Deep Rekursive Dependency

12. März, 2010

Ich habe PHP installiert 5.2 bei einem meiner Tests heute Computer und ein paar Stückchen Code, arbeitete zuvor in feine Version 5.1.6 warf fatale Fehler in der neuen Version. Die Fehlermeldung war "Schachtelungsebene zu tief - recursive Abhängigkeit?"Und es dauerte ein wenig Zeit

auf die Spur der Wurzel des Problems. Hier ist, was ich falsch gemacht.

In PHP gibt es zwei Vergleichsoperatoren, == Und ===. Es ist bekannt, dass in der Regel die erste ist nicht so streng, aber der zweite Typ ist. So, zum Beispiel

Echo ( == false 0 ); // wahr

Echo ( false === 0 ); // falsch

- 0 ist ein Integer und falsch ist ein boolean

Mein Problem ergab sich aus mit nicht-strikte Typisierung mit Objekten.

$a = new MyObj();
$b = new MyObj();
wenn( $a == $b )

Ich hatte nicht bedacht, was ich mit diesem Code machen. Beim Vergleich von zwei Objekten mit Hilfe der nicht-strengen Vergleich Betreiber (==) PHP vergleicht alle Eigenschaften der Objekte und die Objekte, wenn sie übereinstimmen, werden als gleich. Wenn sie nicht übereinstimmen sie sind nicht gleich. In Wirklichkeit, Wir haben eine rekursive Vergleich der alle Eigenschaften der einzelnen Objekte, und alle ihre Eigenschaften, usw.. bis wir zu den elementaren Datentypen wie Strings und Zahlen.

If, aber, verwenden wir strengen Vergleich (===), PHP wird prüfen, ob die beiden Objekte genau das gleiche Objekt, nicht nur Objekte mit gleichen Eigenschaften.

Klasse MyObj
{
public $ p;
}

$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
Echo ( $a == $c ); // falsch
Echo ( $a == $b ); // wahr
Echo ( $a === $b ); // falsch

Das Problem entsteht, wenn Sie in Ihrem Zirkelbezüge Objekte Eigenschaften haben. So, zum Beispiel

Klasse MyObj
{
public $ p;
}
Klasse OtherObj
{
public $ q;
}

$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $ a; // die Zirkelverweis: $a->p->=== Q $ a

$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// anderen Zirkelverweis: $c->p->q $ c ===

Echo ( $a == $c ); // Fatal error:
Nesting level too deep – rekursive Abhängigkeit?

Um die Vergleichbarkeit zu $ a $ c, PHP muss vergleichen, ihre Eigenschaften. So die Logik in PHP geht so etwas wie dieses: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p etc. auf unbestimmte Zeit.

PHP 5.1 schien glatt über das Problem irgendwie (wahrscheinlich nach einer bestimmten Ebene der Rekursion es einfach falsch zurückgegeben) – und normalerweise ist es bestens geklappt. PHP 5.2 korrekt produziert das fatal error oben.

Sobald Sie wissen, das Problem, Die Lösung ist einfach – use strict Vergleich.

Echo ( $a === $c ); // falsch (und kein Fehler)

Die strengen Vergleich einfach überprüfen, ob die beiden Objekte an der gleichen Stelle in Erinnerung sind und so gar nicht an die Werte der Eigenschaften suchen.

NB. Das gleiche Problem kann auftreten, wenn die negierte Vergleichsoperatoren (Verwendung !== Statt !=) und bei der Verwendung in_array (Verwendung in_array dritte Parameter geben strengen Vergleich).

Share and Enjoy

  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency