PHP Ошибка уровень вложенности Too Deep рекурсивных зависимостей

12 марта, 2010 по администратора Написать ответ »

Я установил PHP 5.2 на одном из моих компьютеров, тестирование сегодня и пара битов кода, который ранее работал штрафа в версии 5.1.6 бросил фатальных ошибок в новой версии. Сообщение об ошибке было "уровня вложенности слишком глубоко - рекурсивная зависимость?", И она занимает немного времени выследить корень проблемы. Вот что я сделал неправильно.

В PHP Есть две операции сравнения, == И ===. Это общеизвестно, что первое не является строгим, но о типе второй. Так, for example

эхо ( ложных == 0 ); // истинный

эхо ( ложных === 0 ); // фальшивый

- 0 целое и ложных булевой

Моя проблема связана с использованием нестрогих набрав с объектами.

$a = new MyObj();
$b = new MyObj();
если( $a == $b )

Я не рассмотрел, что я делаю с этим кодом. Если сравнивать два объектов с использованием нестрогих оператор сравнения (==) PHP сравнивает все свойства объектов, и если они соответствуют объекты считаются равными. Если они не совпадают они не равны. В сущности, У нас есть рекурсивное сравнение всех свойств каждого объекта, и все их свойства, и т.д.. пока мы не достигнем основные типы данных, такие как строки и целые числа.

If, однако, мы используем строгое сравнение (===), PHP проверит двух объектов в точности тот же объект, не только объекты с одинаковыми свойствами.

класса MyObj
{
общественного $ р;
}

$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->р = 1;
$b->р = 1;
$c->р = 2;
эхо ( $a == $c ); // фальшивый
эхо ( $a == $b ); // истинный
эхо ( $a === $b ); // фальшивый

Проблема возникает, если у вас есть циклические ссылки в свойствах объектов. Так, for example

класса MyObj
{
общественного $ р;
}
класса OtherObj
{
общественного $ Q;
}

$a = new MyObj();
$b = new OtherObj();
$a->р = $ B;
$b->д = $; // циклической ссылки: $a->p->=== Q $

$c = new MyObj();
$d = new OtherObj();
$c->р = $ г;
$d->д = $ C;// еще одно циркулярное ссылки: $c->p->д $ C ===

эхо ( $a == $c ); // Фатальная ошибка:
Nesting level too deep – рекурсивная зависимость?

Для сравнения $ до $ с, PHP должен сравнить их свойства. Поэтому логика в PHP выходит что-то подобное: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->р и т.д.. на неопределенное время.

PHP 5.1 Казалось сгладить проблемы каким-то образом (вероятно, после определенного уровня рекурсии он просто вернулся ложной) – и обычно это сработало хорошо. PHP 5.2 правильно производит фатальная ошибка выше.

После того как вы знаете, проблема, Решение легко – использовать строгое сравнение.

эхо ( $a === $c ); // фальшивый (и не ошибка)

Строгое сравнение просто проверить два объекта в том же месте в памяти и даже не смотреть на значения свойств.

Н.Б.. Та же проблема может возникнуть при использовании отрицается операторы сравнения (использовать !== А !=) и при использовании in_array (Третий параметр использовать in_array на указывают строгое сравнение).

Делите и наслаждайтесь

  • 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
Реклама

Написать ответ

Вы должны быть вошли в систему чтобы оставить комментарий.