سؤال

لقد سمعت شائعات بأن PHP تخطط لتقديم أمر "goto".ما الذي من المفترض أن تفعله؟

لقد حاولت البحث قليلاً، ولكن لم أجد أي شيء وصفي بفظاعة.أنا أفهم أنه لن يكون "GOTO 10"- مثل الأمر ...

هل كانت مفيدة؟

المحلول

إنهم لا يضيفون GOTO حقيقيًا، ولكنهم يقومون بتوسيع الكلمة الأساسية BR لاستخدام التصنيفات الثابتة.في الأساس، سيتم تعزيز القدرة على الخروج منها يُحوّل متداخلة إذا البيانات.إليك مثال المفهوم الذي وجدته:

<?php
for ($i = 0; $i < 9; $i++) {
    if (true) {
        break blah;
    }
    echo "not shown";
    blah:
    echo "iteration $i\n";
}
?>

بالطبع، بمجرد انتشار "شائعة" GOTO، لم يكن هناك ما يمنع بعض الأشرار من نشر المزيد يأتي من نكتة.كن على أصابع قدميك.

أنظر أيضا:

http://www.php.net/~derick/meeting-notes.html#adding-goto

نصائح أخرى

أنا مندهش دائمًا من مدى غباء مصممي PHP.إذا كان الغرض من استخدام GOTOS هو جعل الخروج من حلقات متداخلة أكثر كفاءة ، فهناك طريقة أفضل:كتل الرمز المسمى والبيانات التي يمكن أن تشير إلى الملصقات:

a:  for (...) {
    b:  for (...) {
         c: for (...) {
               ...
               break a;
           }
       }
   }

أصبح من الواضح الآن أي حلقة/كتلة يجب الخروج منها، والخروج منظم؛لا يمكنك الحصول على كود السباغيتي بهذا كما يمكنك باستخدام gotos الحقيقية.

هذه فكرة قديمة، قديمة، قديمة.تم حل تصميم هياكل إدارة تدفق التحكم الجيدة منذ السبعينيات ، والأدب على كل هذا منذ فترة طويلة مكتوبة.أظهرت نظرية Bohm-jacopini أنه يمكنك ترميز أي شيء باستخدام استدعاء الوظيفة ، وإذا كان Else ، وبينما الحلقات.في الممارسة العملية ، للخروج من الكتل المتداخلة العميقة ، يتطلب ترميز نمط Bohm-Jacopini أعلامًا إضافية منطقية ("اضبط هذه العلامة للخروج من الحلقة") التي كانت ترميز خرقاء غير فعالة (لا تريد مثل هذه العلامات في الخاص بك الحلقة الداخلية).مع If-then-else ، حلقات مختلفة (بينما ، من أجل) وكتلة كسر إلى علامات ، يمكنك ترميز أي خوارزمية دون أي خسارة في الكفاءة.لماذا لا يقرأ الناس الأدب ، بدلاً من نسخ ما فعله C؟غرر.

من المؤكد أنني لست مبرمج PHP، ولا أعرف كيف سيبدو تطبيق PHP الدقيق لـ GOTO، ولكن هذا هو فهمي لـ GOTO:

GOTO هو مجرد بيان أكثر وضوحًا للتحكم في التدفق مثل أي بيان آخر.لنفترض أن لديك بعض الحلقات المتداخلة وتحتاج فقط إلى العثور على شيء واحد.يمكنك وضع عبارة شرطية (أو عدة) وعندما يتم استيفاء الشروط بشكل صحيح، يمكنك استخدام عبارة GOTO للخروج من جميع الحلقات، (بدلاً من وجود عبارة "فاصل" في كل مستوى من التداخل مع عبارة شرطية لكل.ونعم، أعتقد أن التنفيذ التقليدي هو تسمية التسميات التي يمكن لعبارة GOTO الانتقال إليها بالاسم.يمكنك القيام بشيء مثل هذا:

for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
} 
:outside

يعد هذا تنفيذًا أبسط (وأكثر كفاءة) من دون عبارات GOTO.سيكون المعادل:

for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
} 

في الحالة الثانية (وهي ممارسة شائعة) هناك ثلاث عبارات شرطية، ومن الواضح أنها أبطأ من وجود واحدة فقط.لذلك، لأسباب التحسين/التبسيط، قد ترغب في استخدام عبارات GOTO في حلقات متداخلة بإحكام.

في المثال الذي قدمه ستيفيث45 يمكنك استخدام وظيفة بدلاً من ذلك:

function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

// no need for label now
theItem = findItem(a, b, c);

هو - هي تبدو كما هو الحال حاليًا في PHP 5.3، لكن لم يتم توثيقه بالكامل بعد.مما يمكنني قوله أنه يشترك في بناء جملة goto الخاص به مع لغة C، لذلك يجب أن يكون من السهل التقاطه واستخدامه.فقط تذكر ديكسترا تحذير واستخدامه فقط عند الضرورة.

@ستيفيث45

حكم الإبهام الخاص بي هو أنه إذا كان لديك رمز متداخل أكثر من 3 مستويات عميقة ، فأنت تفعل شيئًا خاطئًا.

ثم لا داعي للقلق بشأن استخدام عبارات فاصل متعددة أو الانتقال إلى :D

هناك goto في PHP -> http://php.net/manual/en/control-structures.goto.php, لكني لن أستخدمه، فقط أكتب الكود العادي...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top