2010-02-24 9 views
19

मैं PHP में कुछ फ़ंक्शंस को फिर से परिभाषित करना चाहता हूं जो उदाहरण के लिए पहले से बनाए गए हैं, echo() या time() - मुझे परीक्षण के लिए केवल एक स्क्रिप्ट के भीतर वैश्विक स्तर पर इन कार्यों को परिभाषित करने की आवश्यकता नहीं है ।PHP फ़ंक्शन में निर्मित Redefine

मुझे लगता है कि यह पर्ल में किया जा सकता है लेकिन PHP में - क्या यह संभव है?

+1

संभव डुप्लिकेट (http://stackoverflow.com/ प्रश्न/1837184/यह-संभव-से-प्रतिस्थापन-ए-फ़ंक्शन-इन-php-like-as-mail-and-make-it-do-someth) – outis

+1

... [क्या यह प्रतिस्थापित करना संभव है (बंदरगाह) PHP फ़ंक्शन?] (Http: // stackoverflow।कॉम/क्यू/53064 9 /), [पीएचपी कक्षा के तरीके या कक्षा को फिर से परिभाषित करें] (http://stackoverflow.com/q/137006/) – outis

+0

... कोई ऐसा क्यों करेगा? –

उत्तर

17

runkit_function_redefine - एक नया कार्यान्वयन के साथ एक समारोह परिभाषा बदलें

नोट: डिफ़ॉल्ट रूप से, केवल यूज़रस्पेस काम करता है, हटाया जा सकता है नाम दिया गया, या संशोधित। आंतरिक कार्यों को ओवरराइड करने के लिए, आपको php.ini में runkit.internal_override सेटिंग सक्षम करना होगा। Advanced PHP debugger पैकेज से ओवरराइड बिल्ट-इन कार्य

-

+0

क्या इसका सभी PHP स्क्रिप्ट पर वैश्विक प्रभाव पड़ता है, या यह किसी विशेष स्क्रिप्ट के लिए विशिष्ट है? – Abs

+0

आपके द्वारा संपादित की जा रही php.ini फ़ाइल के दायरे पर निर्भर करता है। – Dolph

+4

php.ini फ़ाइल को संपादित करने से PHP की उस विशेष स्थापना पर चल रहे सभी PHP स्क्रिप्ट प्रभावित होंगे। फ़ंक्शन पुनर्वितरण स्वयं, स्क्रिप्ट्स के लिए विशिष्ट है जो 'runkit_function_redefine()' को कॉल करते हैं। –

6

तुम भी

override_function() की जाँच कर सकते हैं।

देशी PHP फ़ंक्शंस या भाषा विवरणों को फिर से परिभाषित करने के बाद अलार्म घंटी बजानी चाहिए। यह मेरी राय में आपके उत्पादन कोड का हिस्सा नहीं होना चाहिए, जब तक आप एक डीबगर या इसी तरह के उपकरण लिख रहे हों।

एक अन्य विकल्प का उपयोग करने के http://antecedent.github.io/patchwork

पैचवर्क यह संभव कार्यावधि में उपयोगकर्ता-निर्धारित कार्य करता है और तरीकों को फिर से परिभाषित करने के लिए, शिथिल शुद्ध पीएचपी 5.3 कोड में कार्यक्षमता runkit_function_redefine नकल करता है कि एक PHP पुस्तकालय है होगा जो, अन्य चीजों के अलावा, आपको परीक्षण युगल के साथ स्थिर और निजी तरीकों को प्रतिस्थापित करने में सक्षम बनाता है।

बाद हालांकि

+0

@ गॉर्डन - सुझाव के लिए धन्यवाद। मैं सिर्फ परीक्षण उद्देश्यों के लिए ऐसा करना चाहता हूं, न कि उत्पादन कोड - आप सही हैं कि यह अलार्म घंटी बजती है! – Abs

1

echo देशी कार्यों के लिए काम नहीं करता है, एक समारोह नहीं है, यह एक भाषा निर्माण है। मेरे पास इसके लिए कुछ भी नहीं है।

लेकिन फ़ंक्शन को कॉल time() तरह PHP-5.3's namespace fallback policy के बाद से अधिरोहित जा सकता है:

कार्यों के लिए [...], पीएचपी वापस वैश्विक कार्यों के लिए गिर जाएगी [...] एक namespaced समारोह [...] मौजूद नहीं है, तो।

उदा। अयोग्य फंक्शन कॉल time() गैर वैश्विक नामस्थान foo में आप foo\time() प्रदान कर सकते हैं।

व्यक्तिगत रूप से मैं इसे नकली करने के लिए उपयोग कर रहा हूं उदा। इकाई परीक्षण के लिए time()। मैं पुस्तकालय PHP-Mock में उन लोगों के mocks प्रकाशित:

namespace foo; 

use phpmock\phpunit\PHPMock; 

class FooTest extends \PHPUnit_Framework_TestCase 
{ 

    use PHPMock; 

    public function testBar() 
    { 
     $time = $this->getFunctionMock(__NAMESPACE__, "time"); 
     $time->expects($this->once())->willReturn(3); 
     $this->assertEquals(3, time()); 
    } 
} 
की [? यह संभव php (जैसे कि मेल) में एक समारोह की जगह है और यह कुछ और करना बनाने के लिए है]
संबंधित मुद्दे