2010-11-15 5 views
6

PHP घोंसले के कार्यों की अनुमति क्यों देगा?घोंसला PHP-functions: किस उद्देश्य के लिए?

<?php 
function foo() { 
    function bar() { 
     return "bar"; 
    } 
    return "foo"; 
} 
print foo(); 
print bar(); 

.. मान्य PHP है।

लेकिन:

  1. क्यों घोंसले कभी जरूरत होगी?
  2. और यदि ऐसा भी है, तो मैं कहीं भी बार को क्यों कॉल कर सकता हूं (और नहीं, उदाहरण के लिए केवल foo(), या trough foo.bar() या ऐसे)।

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

उत्तर: commentor बताते हैं कि इस एक नकल What are php nested functions for की है।

+1

लवली। जैसे कि PHP को नफरत हासिल करने के लिए एक अन्य कारण की आवश्यकता है ... –

+1

पहले से ही बहुत अच्छी तरह से कवर किया गया है: संभावित डुप्लिकेट [php नेस्टेड फ़ंक्शंस क्या हैं?] (Http://stackoverflow.com/questions/415969/what-are- php-nested-functions-for) – meagar

+3

इसके अलावा, सिर्फ इसलिए कि आप कुछ समझ नहीं पाते हैं, यह "idiocracy" नहीं बनाता है, जो कि एक शब्द नहीं है। – meagar

उत्तर

7

ध्यान दें कि आदेश यहां महत्वपूर्ण है; आप अपने उदाहरण में foo() को कॉल करने से पहले बार() को कॉल नहीं कर सकते हैं। यहां तर्क यह प्रतीत होता है कि foo() को निष्पादन बार() को परिभाषित करता है और इसे वैश्विक दायरे में रखता है, लेकिन इसे स्कोपिंग के कारण foo() के निष्पादन से पहले परिभाषित नहीं किया जाता है।

यहां उपयोग फ़ंक्शन ओवरलोडिंग का एक आदिम रूप होगा; आप अपने बार() फ़ंक्शन को अलग-अलग संचालन कर सकते हैं, इस पर निर्भर करता है कि foo() के कौन से संस्करण ने यह घोषणा की है कि foo() का प्रत्येक अलग संस्करण वास्तव में एक बार() फ़ंक्शन को परिभाषित करता है।

+2

मुझे आश्चर्य है कि क्या होता है जब 'foo()' को ' दूसरी बार। एक सोचता है कि एक त्रुटि फेंक दी जाएगी क्योंकि 'बार() 'पहले ही परिभाषित है। – dnagirl

+2

@dnagirl: यह करता है: घातक त्रुटि: func।पहले से ही परिभाषित। – berkes

6

PHP में आप फ़ंक्शन, रन-टाइम स्थिरांक और यहां तक ​​कि कक्षाओं को सशर्त रूप से परिभाषित कर सकते हैं। यह आपको परिस्थितियों के आधार पर विभिन्न कार्यों/स्थिरांक/कक्षाओं को परिभाषित करने की अनुमति देता है।

बस उदाहरण: String\Length फ़ंक्शन को परिभाषित करें कि आपके आवेदन में मल्टीबाइट समर्थन चालू या बंद है या नहीं।

namespace String; 

if (\MULTIBYTE_MODE) { 
    function Length($string) { 
     return strlen($string); 
    } 
} else { 
    function Length($string) { 
     return mb_strlen($string); 
    } 
} 

नेस्टेड फ़ंक्शंस सशर्त फ़ंक्शन परिभाषा का केवल एक विशेष मामला है।