Сум инсталиран PHP 5.2 на еден од моите тестирање компјутери денес и неколку делови од кодот кој претходно работел парична казна во верзија 5.1.6 фрли фатални грешки во новата верзија. Порака за грешка беше "вгнездени премногу длабоко ниво - рекурзивен зависност?"И го презеде малку време
Во PHP има две споредба оператори, == === И. Тоа е општо познато дека првиот не е стриктно за видот, но вториот е. Така, на пример
ехо ( лажни == 0 ); // вистина
ехо ( лажни === 0 ); // лажни
- 0 е цел број и лажни е логичка
Мојот проблем стана од користење на не-пишување стриктно со предмети.
$a = нови MyObj();
$б = new MyObj();
ако( $на == $ б )
…
Јас не го смета она што го правев со овој код. Кога се споредуваат два објекта со помош на не-строга споредба оператор (==) PHP споредува сите својства на предметите и кога тие се совпаѓаат со објекти се смета дека се еднакви. Ако тие не се совпаѓаат со тие не се еднакви. Во сила, имаме рекурзивен споредба на сите својства на секој објект, и сите нивни својства, итн. додека не се постигне основните типови на податоци како стрингови и цели броеви.
Ако, сепак, ние ги користиме строга споредба (===), PHP ќе провери дали двата објекти се токму ист предмет, не само предмети со исти својства.
класа MyObj
{
јавни $ p;
}$a = нови MyObj();
$б = new MyObj();
$в = new MyObj();
$A->p = 1;
$б->p = 1;
$в->p = 2;
ехо ( $на == $ c ); // лажни
ехо ( $на == $ б ); // вистина
ехо ( $на === $ б ); // лажни
Проблемот се јавува ако имаш кружни референци во вашиот објекти имот. Така, на пример
класа MyObj
{
јавни $ p;
}
класа OtherObj
{
јавни $ q;
}$a = нови MyObj();
$б = new OtherObj();
$A->p = $ б;
$б->q = $ a; // на кружни референца: $A->P->=== Н $ a$в = new MyObj();
$D = new OtherObj();
$в->p = $ d;
$D->q = $ c;// друга кружни референца: $в->P->н $ в ===ехо ( $на == $ c ); // Фатална грешка:
Ниво на вгнездување на премногу длабоко – рекурзивен зависност?
Со цел да се споредат $ а до $ c, PHP мора да споредите нивните имоти. Значи логиката во PHP оди нешто вака: $на == $ c ако $ a->p == $c->P ако $ a->p->П == $ c->p->Q, ако $ a->P == $ c-->p ==P-c->p->Q->P итн. неограничено.
PHP 5.1 како да се изедначи во текот на проблемот некако (веројатно после одредено ниво на рPHPурзијата едноставно се врати лажни) – и обично го разработи парична казна. PHP 5.2 правилно произведува фатална грешка погоре.
Откако ќе го знаат проблемот, Решението е лесно – употреба строга споредба.
ехо ( $на === $ c ); // лажни (и нема грешки)
Строгиот споредба едноставно ќе провери дали двата предмети се на истата локација во меморијата и затоа дури и не се погледне на вредностите на својствата.
NB. Истиот проблем може да настане кога се користи негира споредба оператори (употреба !== Наместо !=) и кога се користи in_array (третиот параметар се користи in_array да укажуваат на строга споредба).
