Archive for the ‘Modulecategory

L-iżball PHP BEJTIET livell Recursive wisq fonda dipendenza

March 12, 2010

I installajt PHP 5.2 f ' wieħed mill-kompjuters tat-testijiet tiegħi illum u a koppja tal-bits tal-kodiċi li preċedentament maħduma multa fil-VERŻJONI 5.1.6 threw fatali żbalji fil-verżjoni l-ġdida. Il-messaġġ ta ' żball kien "Nesting livell wisq fonda – recursive-dipendenza fuq?"u ħa ftit ħin

għall-ittrekkjar isfel l-għerq tal-problema. Hawn huwa dak I kellu jsir ħażin.

PHP hemm żewġ paragun operaturi, == u ===. Huwa ġeneralment magħruf li l-ewwel ma jkunx stretti dwar it-tip imma hija t-tieni. Hekk, per eżempju

echo ( false == 0 ); // veru

echo ( falza === 0 ); // falz

– 0 hija numru sħiħ u foloz huwa a boolean

Tiegħi il-problema nħolqot milli jużaw ittajpjar mhux stretta ma ' l-oġġetti.

$a = MyObj ġodda();
$b = MyObj ġodda();
jekk( $a == $b )

I hadn't kkunsidrati dak I kienet tagħmel ma ' dan il-kodiċi. Meta tqabbel żewġ oġġetti bl-użu ta ' l-operatur ta ' tqabbil mhux stretta (==) PHP jipparaguna l-propjetajiet kollha ta ' l-oġġetti u jekk dawn jaqblu ma l-oġġetti huma meqjusa li huma ugwali. Jekk m ' għandekx Qabbel ma jkunux ugwali. Fil-fatt, Għandna paragun recursive tal-propjetajiet kollha ta ' kull oġġett, u l-proprjetajiet kollha tagħhom, eċċ. sakemm aħna jilħqu tipi tad-data bażika bħal f'qatet twal u integri.

Jekk, Madankollu, Aħna nużaw paragun stretta (===), PHP se jiċċekkja jekk l-oġġetti żewġ huma eżattament l-istess oġġett, oġġetti mhux biss ma ' l-istess propjetajiet.

klassi MyObj
{
pubbliku $p;
}

$a = MyObj ġodda();
$b = MyObj ġodda();
$c = MyObj ġodda();
$'->p = 1;
$b->p = 1;
$ċ->p = 2;
echo ( $a == $c ); // falz
echo ( $a == $b ); // veru
echo ( $a === $b ); // falz

Il-problema tinqala jekk għandek referenzi ċirkolari fil tiegħek proprjetajiet ta ' l-oġġetti. Hekk, per eżempju

klassi MyObj
{
pubbliku $p;
}
klassi OtherObj
{
pubbliku $q;
}

$a = MyObj ġodda();
$b = OtherObj ġodda();
$'->p = $b;
$b->q = $a; // -referenza ċirkulari: $'->p->q === $a

$c = MyObj ġodda();
$d = OtherObj ġodda();
$ċ->p = $d;
$d->q = $c;// referenza għat-tond ieħor: $ċ->p->q === $c

echo ( $a == $c ); // Żball fatali:
BEJTIET livell twila wisq – dipendenza fuq l-recursive?

Sabiex iqabblu $a biex $c, PHP għandhom iqabblu l-proprjetajiet tagħhom. Hekk il-loġika fil-PHP imur xi ħaġa bħal din: $a == $c jekk $a ->p == $c ->p jekk $a ->p->q == $c ->p->q jekk $a ->p->q->p == $c ->p->q->p eċċ. indefinittivament.

PHP 5.1 mid-dehra biex tillixxa fuq il-problema b'xi mod (probabbilment wara ċertu livell ta ' l-recursion huwa sempliċiment irritornat foloz) – u s-soltu huwa ħadem l-multa. PHP 5.2 tipproduċi sew l-iżball fatali hawn fuq.

Ladarba inti tkun taf il-problema, is-soluzzjoni hija faċli – Uża l-paragun stretta.

echo ( $a === $c ); // falz (u ebda żball)

Il-paragun stretta se sempliċiment tivverifika jekk l-oġġetti żewġ huma fl-istess post fil-memorja u hekk ma tissodisfax anke Ħares lejn il-valuri tal-proprjetajiet.

N.B.. L-istess problema tista ' tinqala ' meta bl-użu ta ' l-operaturi ta ' paragun negated (l-użu !== minflok !=) u meta in_array bl-użu (użu tal-in_array terzi parametru li jindikaw paragun stretta).