Es uzinstalēju PHP 5.2 ir viens no maniem testēšanas datoru šodien un bitu kodu, kas iepriekš strādāja fine versijā pāris 5.1.6 threw fatālas kļūdas jauno versiju. Kļūdas ziņojums bija "Ligzdošanas līmenis ir pārāk dziļi - rekursīvas atkarība?", Un tas aizņēma nedaudz laika
PHP ir divas salīdzinājuma operatoriem, == Un ===. Ir vispārēji zināms, ka pirmais nav stingras par veidu, bet otrais ir. Tā, piemēram,
atbalss ( viltus == 0 ); // patiess
atbalss ( viltus === 0 ); // nepatiess
- 0 ir vesels skaitlis, un viltus ir Būla
Mana problēma radās izmantot bez stingras grupu ar objektiem.
$= jauni MyObj();
$b = jauni MyObj();
ja( $== $ b )
…
Man bija neuzskatīja to, kas man bija darīt ar šo kodu. Salīdzinot divus priekšmetus izmanto ne-stingru salīdzināšanas operators (==) PHP salīdzina visas īpašības objektiem un ja tie atbilst priekšmeti ir uzskatāmi par vienādu. Ja tie nesakrīt tie nav vienādi. Būtībā, mums ir rekursīvs salīdzinājums visu katra objekta īpašībām, un visas to īpašības, uc. kamēr mēs sasniegt bāzes datu tipi, piemēram, virknes un integers.
Ja, tomēr, mēs izmantojam stingru salīdzinājumu (===), PHP būs jāpārbauda, vai divi objekti ir tieši tāds pats priekšmets, ne tikai objektus ar tādu pašu īpašībām.
klase MyObj
{
valsts $ p;
}$= jauni MyObj();
$b = jauni MyObj();
$c = jauni MyObj();
$->p = 1;
$b->p = 1;
$c->p = 2;
atbalss ( $== $ c ); // nepatiess
atbalss ( $== $ b ); // patiess
atbalss ( $=== $ b ); // nepatiess
Problēma rodas, ja jums ir riņķveida atsauces jūsu objektu īpašības. Tā, piemēram,
klase MyObj
{
valsts $ p;
}
klase OtherObj
{
valsts $ q;
}$= jauni MyObj();
$b = jauni OtherObj();
$->p = $ b;
$b->q = $; // riņķveida atsauces: $->p->=== $ Q$c = jauni MyObj();
$d = jauni OtherObj();
$c->p = $ d;
$d->q = $ c;// citu riņķveida atsauces: $c->p->q $ c ===atbalss ( $== $ c ); // Fatāla kļūda:
Ligzdošanas līmeņa pārāk dziļi – rekursīvas atkarība?
Lai salīdzinātu $ līdz $ c, PHP ir salīdzināt to īpašības. Tātad PHP loģika iet kaut kas līdzīgs šim: $== $ c, ja $ a->p == $c->p ja $ a->p->q == $ c->p->q ja $ a->p->q-&p == $ c-$c-&gp-p->q->p utt. uz nenoteiktu laiku.
PHP 5.1 šķita vienmērīgu pār problēmu kaut kā (iespējams pēc noteikta līmeņa recursion tā vienkārši atpakaļ nepatiesu) – un parasti tā strPHPja, kas soda. PHP 5.2 pareizi ražo fatāla kļūda iepriekš.
Tiklīdz jūs zināt problēmu, risinājums ir viegli – izmantot stingru salīdzinājumu.
atbalss ( $=== $ c ); // nepatiess (un neviena kļūda)
Stingra salīdzinājums vienkārši pārbaudīt, vai divi objekti ir vienā un tajā pašā vietā atmiņā, un tāpēc nav pat apskatīt īpašumu vērtību.
NB. Tāda pati problēma var rasties, izmantojot noliegt salīdzināšanas operatoru (izmantot !== Nevis !=) un lietojot in_array (izmantot in_array Trešais parametrs norāda stingru salīdzinājumu).
