Я установил 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 на указывают строгое сравнение).
