Я усталяваў 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;
$d->д = $ C;// яшчэ адно цыркулярны спасылкі: $c->p->д $ C ===рэха ( $a == $c ); // Фатальна памылка:
Узровень ўкладзенасці занадта глыбока – рэкурсіўнае залежнасць?
Для параўнання $ да $ з, 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 ён проста вярнуўся ілжывай) – і звычайна гэта спрацавала добра. PHP 5.2 правільна вырабляе фатальна памылка вышэй.
Пасля таго як вы ведаеце, праблема, Рашэнне лёгка – выкарыстоўваць строгае параўнанне.
рэха ( $a === $c ); // фальшывы (і не памылка)
Строгае параўнанне проста праверыць два аб'екта ў тым жа месцы ў памяці і нават не глядзець на значэння уласцівасцяў.
Н.Б.. Тая ж праблема можа ўзнікнуць пры выкарыстанні адмаўляецца аператары параўнання (выкарыстоўваць !== А !=) і пры выкарыстанні in_array (use in_array’s third parameter to indicate strict comparison).
