2010-04-27 3 views
12

यह हमेशा मुझे bugged है एक पुनरावर्ती समारोह ही नाम के लिए, जब एक instantiated वर्ग $this उपयोग कर सकते हैं की जरूरत है और एक स्थिर विधि का उपयोग कर सकते हैं self आदिक्या आप अपना नाम दोहराए बिना PHP फ़ंक्शन रिकर्सिव बना सकते हैं?

वहाँ इसे फिर से नामकरण के बिना एक समान तरीके से एक पुनरावर्ती समारोह में यह करने के लिए है (सिर्फ रखरखाव पर कटौती करने के लिए)?

स्पष्ट रूप से मैं call_user_func या __FUNCTION__ निरंतर उपयोग कर सकता हूं लेकिन मैं कुछ बदसूरत पसंद करूंगा।

+2

+1 सच Grt प्रश्न ... –

+5

क्यों '__FUNCTION__' बदसूरत है? आपको जो चाहिए वो हासिल करने के लिए एक बहुत अच्छा तरीका लगता है ... –

+0

@ फ़ेलिक्स क्योंकि इसे शायद 'call_user_func' या 'eval' में जोड़ा जाना होगा। मैं 'self :: ($ var)' – alex

उत्तर

9

आप variable functions का उपयोग कर सकते हैं और फ़ंक्शन नाम के साथ एक चर को घोषित कर सकते हैं (या कहीं भी)। call_user_func के लिए कोई ज़रूरत नहीं:

function test($i) { 
    $__name = __FUNCTION__; 
    if($i > 5) { 
     echo $i. "\n"; 
     $__name($i-1); 
    } 
} 

मत भूलना कि असली समारोह नाम का उपयोग शायद अन्य लोगों को :) के लिए अधिक पठनीय

(कम से कम एक टिप्पणी क्यों आप ऐसा करते हैं प्रदान करते हैं) है

अद्यतन:
@Alix उसकी टिप्पणी में उल्लेख है, यहघोषित करने के लिए उपयोगी हो सकता हैstatic के रूप में। इस तरह, मान को चर के लिए बार-बार असाइन नहीं किया जाता है।

+0

उन लोगों के बारे में भूल गए। यह 'call_user_func_array() 'से थोड़ा अच्छा दिखता है। धन्यवाद +1 – alex

+0

+1, यह धोखाधड़ी है! = पी –

+0

मैं आपके अंतिम बिंदु से सहमत हूं। हालांकि मुझे लगता है कि आपको * रिकर्सिव कॉल को तोड़ने के बिना किसी फ़ंक्शन का नाम बदलने में सक्षम होना चाहिए। हालांकि मुझे लगता है कि बदलते फ़ंक्शन नाम कहीं और किसी भी कॉल को तोड़ते हैं। मुझे लगता है कि यही कारण है कि आपको शुरुआत से वाकई अच्छे फ़ंक्शन नाम चुनना चाहिए! – alex

5

मैं नहीं जानता कि क्यों यह बदसूरत है:

return call_user_func_array(__FUNCTION__, func_get_args()); 

बनाम:

return call_user_func_array('someFunction', func_get_args()); 

तुम अब भी अगर आप (यदि रखरखाव में कटौती करने के लिए देख रहे हैं call_user_func_array() का उपयोग करने की आवश्यकता होगी आपकी कार्यों में तर्कों की एक बहुत/अलग संख्या है)।

I don't see another way के अलावा। एक स्थिर विधि self:: का उपयोग करके स्वयं को संदर्भित नहीं कर सकती है, केवल इसकी कक्षा में। ऐसा करने के लिए आपको जादू __METHOD__ निरंतर उपयोग करने की आवश्यकता होगी।

+1

'स्वयं ::' के संबंध में, मेरा यही मतलब था। आप उसी वर्ग में अन्य विधियों तक पहुंच सकते हैं। मैंने सोचा कि यह 'स्वयं' जैसी सरल चीज़ की तुलना में बदसूरत दिखता है। – alex

+0

आपके उत्तर के लिए धन्यवाद Alix +1 – alex

+0

@alex: धन्यवाद, कोई समस्या नहीं! =) –

0

आप में से जो लोग एक स्थिर विधि के भीतर ऐसा करना चाहते हैं के लिए:

forward_static_call(array('self', __METHOD__), $arg1, $arg2, $etc); 

इस तरह विधि का नाम बदले जाने अगर तुम न यह के भीतर भी सब प्रत्यावर्तन कॉल बदलने के बारे में चिंता करने की ज़रूरत।

2
function anyfunc() { 
    __FUNCTION__(); 
} 

अगर कक्षा में प्रयोग किया है:

protected function anymethod() { 
    $this->{__FUNCTION__}(); 
} 
0
function self(){ 
    return call_user_func_array(debug_backtrace()[1]['function'], func_get_args()); 
} 

function test($i) { 
    if($i) { 
     echo "$i<br>\n"; 
     self($i-1); 
    } 
} 
test(5); 
संबंधित मुद्दे