Инсталирао сам ПХП 5.2 на један од мојих тестирања рачунара је данас и неколико битова кода који је претходно радио у реду у верзији 5.1.6 бацио кобне грешке у новој верзији. Порука о грешци је "Гнијеждење нивоу превише дубоко - рекурзивна зависност?"И то је мало времена
У ПХП-у постоје два оператора поређења, == И ===. То је опште познато да је прва није строга за тип, али други је. Тако, на пример
одјек ( == фалсе 0 ); // прави
одјек ( лажни === 0 ); // лажан
- 0 је цео број и лажне је Булова
Мој проблем је настао из употребе не-строги куцање са објектима.
$a = new MyObj();
$b = new MyObj();
ако( $a == $b )
…
није Сматрао сам што сам радио са овим код. Када упоређујете два објекта користећи не-строги Оператор поређења (==) ПХП пореди све особине предмета и ако испуњавају објекти се сматрају једнаким. Ако се не подударају нису једнаки. У ствари, имамо рекурзивна поређење свих особина сваког предмета, и све њихове особине, итд. док не достигнемо основне типове података као што су жице и бројеве.
If, међутим, ми користимо строги поређење (===), ПХП ће проверити да ли су два објекта су потпуно исти објекат, не само предмете са истим својствима.
класа МиОбј
{
јавне $ п;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->п = 1;
$b->п = 1;
$c->п = 2;
одјек ( $a == $c ); // лажан
одјек ( $a == $b ); // прави
одјек ( $a === $b ); // лажан
Проблем настаје ако имате циркуларне референце у објектима својства. Тако, на пример
класа МиОбј
{
јавне $ п;
}
класа ОтхерОбј
{
јавне $ к;
}$a = new MyObj();
$b = new OtherObj();
$a->п = $ б;
$b->к = $; // циркуларне референце: $a->p->=== К $$c = new MyObj();
$d = new OtherObj();
$c->п = $ д;
$d->к = $ ц;// други циркуларне референце: $c->p->к $ ц ===одјек ( $a == $c ); // Фатал Еррор:
Nesting level too deep – рекурзивна зависност?
Како би се упоредили $ на $ ц, ПХП морају да упореде своје имовине. Дакле, логика у ПХП-у иде отприлике овако: $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 ); // лажан (и без грешака)
Строгом поређење једноставно проверите да ли су два објекта на истом месту у меморији и тако ни не погледамо вредности имовине.
НБ. Исти проблем може настати када се користи негира поређење оператера (употреба !== Уместо !=) и када користите ин_арраи (трећи параметар користите ин_арраи да указује на строге поређење).
