2011-01-18 16 views
17

क्या मैं एक ही नाम के साथ मौजूदा फ़ंक्शन को फिर से चला सकता हूं, लेकिन अलग कोड? या किसी भी तरह पुराने समारोह को "अक्षम"?PHP - मौजूदा फ़ंक्शन को ओवरराइड करें

मैं कोर वर्डप्रेस फ़ंक्शन को फिर से शुरू करना चाहता हूं, लेकिन चूंकि प्लगइन और थीम इस फ़ंक्शन को बहुत कॉल करते हैं, इसलिए मुझे वही फ़ंक्शन नाम रखना होगा।

+0

ध्यान रखें इसका मतलब है कि इससे आगे के वर्डप्रेस अपडेट्स में परेशानी हो सकती है ... – Tobias

+0

यदि आप सिर्फ प्लगइन या थीम लिख रहे हैं तो आपको कोर आईएमएचओ को छूना नहीं चाहिए। हो सकता है कि आप हमें बता सकें कि आप क्या हासिल करने की कोशिश कर रहे हैं ताकि हम आपकी मदद कर सकें? –

+0

संभावित डुप्लिकेट [PHP फ़ंक्शन में निर्मित रेडिफिन] (http://stackoverflow.com/questions/2326835/redefine-built-in-php-functions) और [PHP फ़ंक्शन को फिर से परिभाषित करना] (http://stackoverflow.com/questions/2640958/पुनर्परिभाषित-php-समारोह)। इन्हें ढूंढने में एक मिनट से भी कम समय लग गया, इसलिए मुझे यकीन है कि आपने खोज फ़ंक्शन का उपयोग किया है और इन्हें भी पाया है। कृपया बताएं कि वे आपके प्रश्न को हल क्यों नहीं कर रहे हैं। – Gordon

उत्तर

6

जेंड इंजन है कि के लिए अनुमति देने के लिए:

Intro

Override Method Docs

नोट: Runkit के बाद से यह को थी और अधिक विशिष्ट है APD से एक बेहतर विकल्प की तरह लगता है के उद्देश्य और आपको मूल विधि को एक अलग पते पर बरकरार रखने की अनुमति होगी।

6

बस वर्ष समारोह बाहर टिप्पणी और लिखने के लिए अपने नए एक;)

PHP में यह फिर से परिभाषित या अधिभार करना संभव नहीं है (अर्थात एक ही नाम है, लेकिन विभिन्न मापदंडों) एक समारोह मूल रूप से एक समारोह परिभाषित करते हैं। वहाँ हालांकि runkit जैसे एक्सटेंशन जो कार्य (runkit_function_redefine) को फिर से परिभाषित करने की अनुमति केवल तभी जब आप APD की तरह कुछ है कि फैली हुई है का उपयोग कर रहे हैं, लेकिन आप शायद इन का उपयोग नहीं करना चाहते हैं (जैसे एक्सटेंशन शायद ही कभी स्थापित कर रहे हैं और ज्यादातर अविश्वसनीय।)

+1

जो मेरी साइट के लिए काम कर सकता है, लेकिन अगर मैं एक सार्वजनिक प्लगइन या थीम लिख रहा हूं तो मैं ऐसा नहीं कर सकता ... – Alex

5

आप एक सशर्त जाँच में मूल कार्य को परिभाषित ब्लॉक लपेट कर सकते हैं अगर एक ही नाम के एक और पहले से ही निर्धारित नहीं है

<?php 
if(!function_exists('function_name')){ 
    //old definition here 
    } ?> 

आप (मैं आप Wordpress कार्य करता है और कोर नहीं पीएचपी लोगों मतलब यह सोचते हैं रहा हूँ) इसके बाद मूल को संरक्षित करते समय इसे ऊपर फिर से परिभाषित किया जाना चाहिए, आपको इसे वापस रोल करने की आवश्यकता है।

कैसे जटिल परिवर्तन कर रहे हैं और कितनी बार आप ऐसा कर सकते हैं पर निर्भर करता है, आप भी Namespaces गौर करने के लिए यदि आप

7

आप वर्डप्रेस हुक (बुलाया फिल्टर और कार्यों इस्तेमाल कर सकते हैं पीएचपी 5. पर हैं चाहते हो सकता है) और उसके बाद आप जिस फ़ंक्शन का उपयोग कर रहे हैं उसे ओवरराइड करने के लिए add_filter() फ़ंक्शन का उपयोग करें।

अर्थात

function function_name() { 
//code goes here 
} 

$hook = 'get_options'; // the function name you're filtering 
add_filter($hook, 'function_name'); 

कोडेक्स इस के साथ एक बहुत मदद मिलेगी।

http://codex.wordpress.org/Plugin_API/Filter_Reference

+0

स्पष्ट रूप से केवल कोड के लिए काम करता है जो 'apply_filter' का उपयोग करता है। कुछ और बस आसानी से छेड़छाड़ नहीं किया जा सकता है। तो यह समाधान पहले कोड में फ़िल्टर के मूल कोड बनाने के उपयोग पर निर्भर करता है। हालांकि अधिक से अधिक वर्डप्रेस कोड (सहित प्लगइन्स) ऐसा करते हैं, लेकिन वे सभी इस विधि को खुद को उधार नहीं देते हैं। दुर्भाग्य से। अभी भी इसे इंगित करने के लिए +1। – 0xC0000022L

3

मेरे प्रयास किया समाधान यह करने के लिए किया गया था:

function suffusion_get_image($options = array()) { 
    include_once ABSPATH.'wp-content/themes/suffusion-child/functions/media.php'; 
    return childtheme_overide_suffusion_get_image($options = array()); 
    .... 
} 

जाहिर है उन्नयन पर एक ऊपरी के रूप में आप फिर से स्क्रिप्ट में वापस लाइनों को जोड़ने की आवश्यकता होती है और मैं इस पद्धति को सफलतापूर्वक इस्तेमाल किया है आज तक, लेकिन अब इसे get_terms के साथ करने की कोशिश कर रहा है- इसमें एक पुनर्विक्रय समस्या शामिल है और मैं इस समय हल करने या काम करने की कोशिश कर रहा हूं।

कोर संपादित करने का मेरा कारण यह है कि मौजूदा कोर एक बहुआयामी आवश्यकता के लिए सुविधाजनक तरीके से प्रदान नहीं करता है।

किसी ने सिर्फ एक और मंच तथापि override_function के प्रयोग पर सुझाव दिया गया है, लेकिन मैनुअल ऐसी है कि वह केवल अंतर्निहित कार्यों के लिए उपयोग की प्रतीत होता है शब्दों में है - मैं ले लिया कार्यों में बनाया पीएचपी

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