Posts Tagged ‘مستوى تداخل عميق جدا’

فب المستوى خطأ تداخل التبعية العودية عميق جدا

12 مارس, 2010

لقد قمت بتركيب فب 5.2 في واحد من أجهزة الكمبيوتر اختبار لي اليوم ، وبضع قطع من الشفرة التي عملت سابقا في إصدار غرامة 5.1.6 ألقى الأخطاء الفادحة في الإصدار الجديد. رسالة الخطأ هو "مستوى تداخل -- العودية عميق جدا التبعية?"واستغرق الأمر بعض الوقت

لتعقب جذور المشكلة. وإليك ما كنت فعلت الخطأ.

في بي هناك عوامل المقارنة 2, == و===. ومن المعروف عموما أن الأولى ليست صارمة حول نوع ولكن الثاني هو. هكذا, for example

صدى ( == كاذبة 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 ); // زائف

وتنشأ المشكلة إذا كان لديك مراجع دائرية في خصائص الأجسام الخاص. هكذا, for example

فئة 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 استخدام ثالث تشير إلى المقارنة الصارم).

حصة واستمتع

  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency
  • wp socializer sprite mask 16px PHP Error Nesting Level Too Deep Recursive Dependency