Я установил PHP 5.2 на одном из моих компьютеров, тестирование сегодня и пара битов кода, который ранее работал штрафа в версии 5.1.6 бросил фатальных ошибок в новой версии. Сообщение об ошибке было "уровня вложенности слишком глубоко - рекурсивная зависимость?", И она занимает немного времени
В PHP Есть две операции сравнения, == И ===. Это общеизвестно, что первое не является строгим, но о типе второй. Так, например
эхо ( ложных == 0 ); // истинный
эхо ( ложных === 0 ); // фальшивый
- 0 целое и ложных булевой
Моя проблема связана с использованием нестрогих набрав с объектами.
$MyObj = новый();
$Ъ = новые MyObj();
если( $== $ Ь )
…
Я не рассмотрел, что я делаю с этим кодом. Если сравнивать два объектов с использованием нестрогих оператор сравнения (==) PHP сравнивает все свойства объектов, и если они соответствуют объекты считаются равными. Если они не совпадают они не равны. В сущности, У нас есть рекурсивное сравнение всех свойств каждого объекта, и все их свойства, и т.д.. пока мы не достигнем основные типы данных, такие как строки и целые числа.
Если, однако, мы используем строгое сравнение (===), PHP проверит двух объектов в точности тот же объект, не только объекты с одинаковыми свойствами.
класса MyObj
{
общественного $ р;
}$MyObj = новый();
$Ъ = новые MyObj();
$с = новый MyObj();
$->р = 1;
$б->р = 1;
$С->р = 2;
эхо ( $== $ с ); // фальшивый
эхо ( $== $ Ь ); // истинный
эхо ( $=== $ B ); // фальшивый
Проблема возникает, если у вас есть циклические ссылки в свойствах объектов. Так, например
класса MyObj
{
общественного $ р;
}
класса OtherObj
{
общественного $ Q;
}$MyObj = новый();
$Ъ = новые OtherObj();
$->р = $ B;
$б->д = $; // циклической ссылки: $->р->=== Q $$с = новый MyObj();
$D = новый OtherObj();
$С->р = $ г;
$г->д = $ C;// еще одно циркулярное ссылки: $С->р->д $ C ===эхо ( $== $ с ); // Фатальная ошибка:
Уровень вложенности слишком глубоко – рекурсивная зависимость?
Для сравнения $ до $ с, PHP должен сравнить их свойства. Поэтому логика в PHP выходит что-то подобное: $== $ в случае $->p == $c->р, если $->p->д == $ с->p->д, если $р == $ с-gt;q->p р- $c->p->д->р и т.д.. на неопределенное время.
PHP 5.1 Казалось сгладить проблемы каким-то образом (вероятно, после определенного уровня PHPкурсии он просто вернулся ложной) – и обычно это сработало хорошо. PHP 5.2 правильно производит фатальная ошибка выше.
После того как вы знаете, проблема, Решение легко – использовать строгое сравнение.
эхо ( $=== $ с ); // фальшивый (и не ошибка)
Строгое сравнение просто проверить два объекта в том же месте в памяти и даже не смотреть на значения свойств.
Н.Б.. Та же проблема может возникнуть при использовании отрицается операторы сравнения (использовать !== А !=) и при использовании in_array (Третий параметр использовать in_array на указывают строгое сравнение).
