من نصب پی اچ پی 5.2 در یکی از کامپیوترهای تست من امروز و چند بیت از کد ها (که قبلا خوب کار می کرد در نسخه 5.1.6 پرتاب اشتباهات مهلک در نسخه جدید. پیام خطا شد این بود "اس ام اف سطح خیلی عمیق -- بازگشتی وابستگی?"و آن زمان هم کمی
در پی اچ پی دو اپراتور مقایسه وجود دارد, == و ===. این به طور کلی می دانیم که اولین در مورد نوع سخت است نه دوم. پس, مثلا
پژواک ( غلط == 0 ); // واقعی
پژواک ( دروغ === 0 ); // غلط
- 0 یک عدد صحیح است و غیرواقعی بولی است
مشکل من ناشی از استفاده از تایپ کردن غیر سخت با اجسام.
$a = new MyObj();
$b = new MyObj();
اگر( $a == $b )
…
من تا به حال در نظر گرفته نه آنچه که من با این کد انجام شد. هنگامی که در مقایسه با استفاده از دو جسم سخت غیر عملگر مقایسه (==) پی اچ پی مقایسه تمام خواص اشیاء و اگر آنها مطابقت اشیاء تلقی می شود برابر. اگر آنها با هم مطابقت ندارند آنها برابر نیستند. در اثر, ما نسبت به بازگشتی از تمام خواص هر شی, و تمام خواص آنها, غیره. تا زمانی که ما در رسیدن به انواع داده اولیه مانند رشته ها و اعداد صحیح.
If, اما, ما از مقایسه دقیق (===), پی اچ پی را چک کنید که آیا دو جسم دقیقا همان شی, نه فقط با خواص مشابه اشیاء.
کلاس MyObj
{
$ فسفر عمومی;
}$a = new MyObj();
$b = new MyObj();
$c = new MyObj();
$a->فسفر = 1;
$b->فسفر = 1;
$c->فسفر = 2;
پژواک ( $a == $c ); // غلط
پژواک ( $a == $b ); // واقعی
پژواک ( $a === $b ); // غلط
مشکل ناشی اگر مراجع در اجسام مدور خود خواص. پس, مثلا
کلاس MyObj
{
$ فسفر عمومی;
}
کلاس OtherObj
{
عمومی پرسش $;
}$a = new MyObj();
$b = new OtherObj();
$a->فسفر = $ ب;
$b->س = $; // مرجع مدور: $a->p->=== سوال $$c = new MyObj();
$d = new OtherObj();
$c->فسفر = $ د;
$d->س = $ ج;// یکی دیگر از مرجع مدور: $c->p->س $ === جپژواک ( $a == $c ); // خطای مهلک:
Nesting level too deep – وابستگی بازگشتی?
به منظور مقایسه $ دلار ج, پی اچ پی باید خواص آنها مقایسه. بنابراین منطق در پی اچ پی می رود چیزی شبیه به این: $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 5.2 به درستی تولید خطای مهلک بالا.
هنگامی که شما می دانید مشکل, راه حل آسان است – مقایسه استفاده از سخت.
پژواک ( $a === $c ); // غلط (و بدون خطا)
مقایسه سخت به سادگی خواهد شد که آیا دو جسم در همان محل در حافظه و غیره آیا در مقادیر خواص حتی نگاه بررسی.
توجه. مشکل مشابه بوجود می آیند می توانند در هنگام استفاده از نفی اپراتورهای مقایسه (استفاده !== به جای !=) و در هنگام استفاده از in_array (پارامتر سوم in_array استفاده کند به منظور نشان دادن نسبت به سخت).
