Mwen te enstale fp 5.2 nan youn nan tès òdinatè mwen an jodi a ak yon koup la Bits nan kòd ki deja travay byen nan vèsyon 5.1.6 te lanse erè fatal nan nouvo vèsyon an. mesaj erè a te "nidifikasyon nivo twò fon - recursive depandans?"E li te pran yon ti tan
Nan fp ki te gen de operatè konparezon, == Ak ===. Li nan jeneralman konnen ke premye a se pa strik sou kalite men dezyèm la se. Se konsa,, for example
eko ( fo == 0 ); // vrè
eko ( fo === 0 ); // fo
- 0 se yon nonm antye ak fo se yon Boiling
pwoblèm mwen an leve nan sezisman lè l sèvi avèk non-strik ak objè.
$a = new MyObj();
$b = new MyObj();
si( $a == $b )
…
Mwen pa te konsidere sa mwen te fè avèk kòd sa a. Lè yo konpare de objè lè l sèvi avèk operatè a konparezon ki pa strik (==) Fp konpare tout pwopriyete ki nan objè yo, epi si yo matche objè yo ke yo dwe egal. Si yo pa koresponn ak sa yo pa egal. An efè, nou gen yon konparezon recursive tout pwopriyete yo pou chak objè, ak tout pwopriyete yo, elatriye. jiskaske nou rive jwenn enfòmasyon debaz tankou kalite fisèl ak nonm antye.
If, Sepandan, nou itilize strik konparezon (===), Fp pral tcheke si objè yo de yo se egzakteman menm objè a, pa sèlman ak objè pwopriyete yo menm.
klas MyObj
{
piblik $ p;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->P = 1;
$b->P = 1;
$c->P = 2;
eko ( $a == $c ); // fo
eko ( $a == $b ); // vrè
eko ( $a === $b ); // fo
pwoblèm nan rive si ou gen referans sikilè nan objè ou pwopriyete. Se konsa,, for example
klas MyObj
{
piblik $ p;
}
klas OtherObj
{
piblik $ Q;
}$a = new MyObj();
$b = new OtherObj();
$a->P = $ B;
$b->q = $ yon; // referans nan sikilè: $a->p->=== Q $ yon$c = new MyObj();
$d = new OtherObj();
$c->p = d $;
$d->Q = $ C;// yon lòt referans sikilè: $c->p->=== Q $ Ceko ( $a == $c ); // Fatal erè:
Nidifikasyon nivo twò fon – recursive depandans?
Yo nan lòd yo konpare yon $ a $ C, Fp dwe konpare pwopriyete yo. Se konsa, lojik la nan fp ale yon bagay tankou sa a: $a == $c if $a->p == $c->p if $a->p->q == $c->p->q if $a->p->q->p == $c->p->q->P elatriye. endefiniman.
PHP 5.1 te sanble ke yo lis sou pwoblèm lan yon jan kanmenm (pwobableman apre yon sèten nivo de rekurans li senpleman retounen fo) – epi anjeneral li te Fpvay soti amann. PHP 5.2 kòrèkteman pwodwi erè fatal la pi wo a.
Yon fwa w konnen pwoblèm nan, solisyon an se fasil – strik itilize konparezon.
eko ( $a === $c ); // fo (e pa gen erè)
konparezon an strik pwal tou senpleman tcheke si objè yo de yo nan kote a menm nan memwa ak sa se pa menm gade valè yo nan pwopriyete yo.
NB. pwoblèm nan ka rive menm lè w ap itilize operatè yo konparezon negation (itilize !== Olye pou yo !=) ak lè w ap itilize in_array (twazyèm parameters in_array itilize la ki endike strik konparezon).
