Stajt installati PHP 5.2 fuq waħda minn kompjuters ittestjar tiegħi llum u koppja ta 'bits ta' kodiċi li qabel kienu ħadmu multa fil-verżjoni 5.1.6 threw żbalji fatali fil-verżjoni l-ġdida. Il-messaġġ ta 'żball kien "livell bejtiet wisq fil-fond - rikursivi dipendenza?"U kien ftit ħin
Fil PHP hemm operaturi paragun żewġ, == U ===. Huwa ġeneralment magħruf li l-ewwel ma stretta dwar it-tip imma t-tieni huwa. Allura, per eżempju
eku ( falza == 0 ); // veru
eku ( falza === 0 ); // foloz
- 0 huwa integer u foloz hija Boolean
problema tiegħi irriżulta mill-użu ittajpjar mhux stretta ma 'oġġetti.
$a = new MyObj();
$b = new MyObj();
if( $a == $b )
…
I ma kinux ikkunsidrati dak I kien isir ma 'dan il-kodiċi. Meta wieħed iqabbel iż-żewġ oġġetti bl-użu l-operatur paragun mhux stretta (==) PHP tqabbel l-proprjetajiet kollha ta 'l-oġġetti u jekk dawn jaqblu mal-oġġetti huma meqjusa li tkun ugwali. Jekk dawn ma jaqblux ma 'dawn ma jkunux ugwali. Fil-fatt, għandna paragun rikursivi ta 'l-kwalitajiet ta' kull oġġett, u kull proprjeta tagħhom, eċċ. sakemm nilħqu tipi bażiċi tad-data bħall-kordi u interi.
Jekk, madankollu, nużaw paragun stretti (===), PHP ser tiċċekkja jekk l-oġġetti tnejn huma eżattament l-istess oġġett, mhux biss oġġetti bl-istess proprjetajiet.
MyObj klassi
{
pubbliku $ p;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->p = 1;
$b->p = 1;
$c->p = 2;
eku ( $a == $c ); // foloz
eku ( $a == $b ); // veru
eku ( $a === $b ); // foloz
Il-problema tqum jekk għandek referenzi ċirkolari oġġetti tiegħek proprjetajiet. Allura, per eżempju
MyObj klassi
{
pubbliku $ p;
}
OtherObj klassi
{
pubbliku $ q;
}$a = new MyObj();
$b = new OtherObj();
$a->p = $ b;
$b->q = $ a; // l-ċirkolari ta 'referenza: $a->p->=== Q $ a$c = new MyObj();
$d = new OtherObj();
$c->p = $ d;
$d->q = $ ċ;// ieħor ċirkolari ta 'referenza: $c->p->q $ ċ ===eku ( $a == $c ); // żball fatali:
Nesting level too deep – rikursivi dipendenza?
Sabiex tikkompara $ a sa $ ċ, PHP għandu jqabbel l-proprjetajiet tagħhom. Allura l-loġika fil-PHP tmur xi ħaġa bħal din: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->p eċċ. indefinittivament.
PHP 5.1 deher li bla xkiel fuq il-problema b'xi (probabbilment wara ċertu livell ta 'recursion huwa sempliċiment irritornat foloz) – u normalment jinħadmu multa. PHP 5.2 korrett tipproduċi l-iżball fatali ta 'hawn fuq.
Ladarba inti tkun taf l-problema, is-soluzzjoni hija faċli – użu paragun stretta.
eku ( $a === $c ); // foloz (u l-ebda żball)
Il-paragun stretti ser sempliċement jivverifika jekk l-oġġetti tnejn huma fl-istess post fil-memorja u għalhekk lanqas ma tħares lejn il-valuri tal-proprjetajiet.
NB. L-istess problema jistgħu jirriżultaw meta jużaw l-operaturi paragun miċħuda (użu !== Minflok !=) u meta jużaw in_array (parametru tielet in_array użu li jindikaw paragun stretti).
