2014-05-20 20 views
6

मुझे और एक सहयोगी एक बहुत ही अजीब व्यवहार नए कीवर्ड "उपज" PHP संस्करण में उपयोग कर पाया: 5.5.11 और हम जानना चाहते हैं, तो निम्न सामान्य है:पीएचपी यील्ड, अजीब व्यवहार

को देखते हुए निम्नलिखित है कोड: गूंज और मर जाता है पूरी तरह से छोड़ दिया और मार डाला नहीं है और सिर्फ वस्तु "उपज" बनाता है var_dumped है:

function yieldTest() 
{ 
    echo 'wtf1'; 
    die('wtf2'); 

    foreach (['foo', 'bar', 'baz'] as $each) { 
     yield $each; 
    } 
} 

var_dump(yieldTest()); 

इस बारे में उत्सुक बात यह है कि अगर "उपज" समारोह, दोनों में मौजूद है।

जब हम मैन्युअल रूप से सरणी/ऑब्जेक्ट बनाते हैं और वापसी का उपयोग करते हैं तो यह कार्य करता है।

हमने पाया कि समारोह में उपज मौजूद होने के बाद भी कुल स्किप अपवाद को फेंक दिया गया है।

क्या यह बहुत अजीब व्यवहार वास्तव में इरादा है या क्या हमें एक बग मिला है?

हम वास्तव में विश्वास नहीं कर सकते कि यह वांछित है क्योंकि इससे कार्यों की विश्वसनीयता कम हो जाएगी।

इसके अलावा Google ने इस समस्या से संबंधित किसी भी जानकारी को नहीं बताया, इसलिए मैंने सोचा कि मैं यहां पूछता हूं।

उत्तर

8

आपका var_dump बस जनरेटर ऑब्जेक्ट आउटपुट करता है। निष्पादन के इस समय समारोह में प्रवेश नहीं किया गया है। आप वास्तव में में आगे बढ़ना जनरेटर का उपयोग करते हैं, तो समारोह के कोड निष्पादित होने

function yieldTest() { 
    echo 'wtf1'; 
    //throw Exception('test'); 

    foreach (['foo', 'bar', 'baz'] as $each) { 
     yield $each; 
    } 
} 

$test = yieldTest(); 
foreach ($test as $k) { 
    var_dump($k); 
} 

outputting

wtf1string (3) "foo" स्ट्रिंग (3) "बार" स्ट्रिंग (3) "baz"

या अपवाद में यह टिप्पणी करता है, तो

+0

को सटीकता से सही उठाती है।। अच्छा उत्तर। – lonesomeday

+0

लॉल यह एक मुश्किल है। हमने सब कुछ परीक्षण किया लेकिन यह नहीं कि, फ़ंक्शन उपयोग में था और इसलिए यह पूरी तरह से अनजान प्रतीत होता था, हालांकि यह अभी भी एक प्रीप्रोसेसर की तरह अजीब है और फ़ंक्शंस को अविश्वसनीय बना सकता है कि कुछ कोड छोड़ दिए जाते हैं या निष्पादित होते हैं जब आप वास्तव में इसे नहीं चाहते हैं। वैसे भी आपके त्वरित और सही प्रतिक्रिया के लिए धन्यवाद। – Steini

+0

यह दस्तावेज है, वैसे: http://www.php.net/manual/en/language.generators.syntax.php#language.generators.object – lonesomeday

संबंधित मुद्दे