Posts com a tag ‘dependência recursiva’

PHP erro nível Assentamento Dependência Too Deep recursiva

Marco 12, 2010

Eu instalei o PHP 5.2 em um dos computadores o meu teste hoje e um par de pedaços de código, que anteriormente trabalhou muito bem na versão 5.1.6 jogou erros fatais na nova versão. A mensagem de erro foi "nível de nidificação muito profundo - recursive dependência?"E levou um pouco de tempo

para rastrear a origem do problema. Aqui está o que eu fiz de errado.

No PHP existem dois operadores de comparação, == E ===. É do conhecimento geral que o primeiro não é rigorosa sobre o tipo, mas o segundo é. Assim, for example

eco ( == false 0 ); // verdadeiro

eco ( === false 0 ); // falso

- 0 é um inteiro e falso é um boolean

Meu problema surgiu com digitação não-estrita com os objetos.

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

Eu não tinha pensado que eu estava fazendo com este código. Quando comparando dois objetos utilizando o operador de comparação não-estrita (==) PHP compara todas as propriedades dos objetos e se combinam os objetos são considerados iguais. Se eles não corresponderem, não são iguais. Na realidade, temos uma relação recursiva de todas as propriedades de cada objeto, e todas as suas propriedades, etc. até chegar a tipos de dados básicos como strings e inteiros.

If, contudo, usamos comparação estrita (===), PHP irá verificar se os dois objetos são exatamente o mesmo objeto, não apenas objetos com as mesmas propriedades.

MyObj classe
{
p public $;
}

$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
eco ( $a == $c ); // falso
eco ( $a == $b ); // verdadeiro
eco ( $a === $b ); // falso

O problema surge quando você tem referências circulares em seus objetos de imóveis. Assim, for example

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

$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $ a; // a referência circular: $a->p->=== Q $ a

$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ c;// outra referência circular: $c->p->q $ c ===

eco ( $a == $c ); // Erro fatal:
Nesting level too deep – dependência recursiva?

A fim de comparar a $ a $ c, PHP deve comparar suas propriedades. Portanto, a lógica em PHP é algo como isto: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p etc. indefinidamente.

PHP 5.1 Parecia bom sobre o problema de alguma forma (provavelmente depois de um certo nível de recursão simplesmente retornou false) – e, normalmente, fPHPionou muito bem. PHP 5.2 corretamente produz o erro fatal acima.

Uma vez que você conhece o problema, A solução é fácil – usar comparação estrita.

eco ( $a === $c ); // falso (e nenhum erro)

A comparação rigorosa simplesmente verificar se os dois objetos estão no mesmo local na memória e assim nem sequer olhar para os valores das propriedades.

NB. O mesmo problema pode surgir quando se utiliza os operadores de comparação negada (utilização !== instead of !=) and when using in_array (use in_array’s third parameter to indicate strict comparison).

Compartilhe e Divirta-se

  • 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