Archive for the ‘Module’ category

Niveau d'erreur PHP nidification dépendance Too Deep récursive

12 mars, 2010

J'ai installé PHP 5.2 à un de mes ordinateurs à l'essai aujourd'hui et un couple de bits de code qui a travaillé auparavant dans la version amende 5.1.6 il produit une erreur fatale dans la nouvelle version. Le message d'erreur était "niveau d'imbrication trop profonde - recursive dépendance?»Et il a fallu un peu de temps

pour traquer la racine du problème. Voici ce que j'avais fait de mal.

En PHP, il ya deux opérateurs de comparaison, == Et ===. Il est généralement connu que le premier n'est pas stricte sur le type, mais le second est. Si, par exemple,

écho ( == false 0 ); // vrai

écho ( false === 0 ); // faux

- 0 est un entier et le faux est un booléen

Mon problème vient de typage non-stricte avec des objets.

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

Je n'avais pas considéré comme ce que je faisais avec ce code. Lorsque l'on compare deux objets en utilisant l'opérateur de comparaison non-stricte (==) PHP compare toutes les propriétés des objets et si elles correspondent aux objets sont réputés être égaux. Si elles ne correspondent pas, ils ne sont pas égaux. En vigueur, nous avons une comparaison récursive de toutes les propriétés de chaque objet, et toutes leurs propriétés, etc. jusqu'à ce qu'on arrive base des types de données comme les chaînes et les nombres entiers.

Si, cependant, nous utilisons une comparaison stricte (===), PHP va vérifier si les deux objets sont exactement le même objet, pas seulement des objets avec les mêmes propriétés.

classe MyObj
{
p public $;
}

$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$C->p = 2;
écho ( $a == $ c ); // faux
écho ( $a == $ b ); // vrai
écho ( $a === $ b ); // faux

Le problème se pose si vous avez des références circulaires dans vos objets propriétés. Si, par exemple,

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

$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $ a; // la référence circulaire: $a->p->=== Q $ par

$c = new MyObj();
$d = new OtherObj();
$C->p = $d;
$D->q = $c;// une autre référence circulaire: $C->p->q === $c

écho ( $a == $ c ); // Erreur fatale:
Niveau d'imbrication trop profonde – dépendance récursive?

Afin de comparer à $ a $ C, PHP doit comparer leurs propriétés. Ainsi, la logique en PHP va quelque chose comme ceci: $une c == $ si $ a->p == $c->p si $ a->p->q == $ C->p->q si $ a->p->q-&p == $ C-$c-&gp-p->Q->p etc. indéfiniment.

PHP 5.1 semblait lisse sur le problème en quelque sorte (probablement après un certain niveau de récursivité c'est tout simplement faux retour) – et enPHPnéral il s'est bien. PHP 5.2 produit correctement l'erreur fatale ci-dessus.

Une fois que vous connaissez le problème, la solution est simple – l'utilisation stricte comparaison.

écho ( $a === $ c ); // faux (et aucune erreur)

La comparaison stricte sera simplement de vérifier si les deux objets sont au même endroit dans la mémoire et donc ne regarde même pas les valeurs des propriétés.

N.B. Le même problème peut survenir lorsque vous utilisez les opérateurs de comparaison niée (utilisation !== Au lieu de !=) et lorsque vous utilisez in_array (troisième paramètre in_array utiliser pour indiquer comparaison stricte).

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