2009-02-10 21 views

उत्तर

11

यह बिट देर से है, लेकिन मैं सिर्फ यह इंगित करना चाहता हूं कि PHP 5.3 के बाद से, PHP एक्सटेंशन का उपयोग किये बिना आंतरिक कार्यों को ओवरराइड करना संभव है।

चाल यह है कि आप किसी नामस्थान के अंदर एक आंतरिक PHP फ़ंक्शन को फिर से परिभाषित कर सकते हैं। यह PHP के कार्यों के लिए नाम समाधान के तरीके पर आधारित है:

नामस्थान के अंदर (ए \ बी कहें), अयोग्य कार्यों को कॉल रन-टाइम पर हल किया जाता है। यहां बताया गया है कि foo() को फ़ंक्शन करने के लिए कॉल कैसे हल किया गया है:

  1. यह वर्तमान नामस्थान से एक फ़ंक्शन ढूंढता है: A \ B \ foo()।
  2. को ढूंढना और कॉल करने के लिए वैश्विक समारोह foo()
+0

अच्छा, यह उत्तर क्यों स्वीकार नहीं किया गया है? – Pacerier

+1

सबसे अधिक संभावना है, क्योंकि यह प्रश्न के लगभग चार साल बाद पोस्ट किया गया था, और स्वीकार्य उत्तर शायद उस समय सबसे प्रासंगिक था। –

+0

मैं अभी भी SO पर हूं ... स्वीकृत! –

9

नहीं, यह संभव नहीं है यह करने के लिए के रूप में आप उम्मीद कर सकते है।

manual से

:

पीएचपी समारोह से अधिक भार का समर्थन नहीं करता, न ही यह परिभाषित या फिर पहले घोषित कार्यों को फिर से परिभाषित करना संभव है।

हालांकि, अगर आप runkit_function_redefine और उसके चचेरे भाई का उपयोग कर सकते हैं, लेकिन यह निश्चित रूप से बहुत ही सुंदर नहीं है ...

तुम भी create_function उपयोग कर सकते हैं कुछ इस तरह करना है:

<?php 
$func = create_function('$a,$b','return $a + $b;'); 
echo $func(3,5); // 8 
$func = create_function('$a,$b','return $a * $b;'); 
echo $func(3,5); // 15 
?> 

के साथ होता है रनकिट, यह बहुत ही सुरुचिपूर्ण नहीं है, लेकिन यह वह व्यवहार देता है जिसे आप ढूंढ रहे हैं।

+0

आपने इसे दो बार कहा, लेकिन यह "बहुत सुरुचिपूर्ण" क्यों नहीं है? – Pacerier

+0

@Pacerier: ठीक है, शुरुआत करने वालों के लिए, यह एक कोड गंध है जो इसे शुरू करने के लिए करना चाहता है, और यह निश्चित रूप से आपके कोड को देखने के लिए आपके पीछे आने वाले किसी को फेंकने जा रहा है, लेकिन यदि आप अतीत में हैं कि आपको फ़ंक्शन कोड को दोनों मामलों में एक स्ट्रिंग तर्क के रूप में टाइप करना होगा, जो कि सबसे कम कार्यों के अलावा किसी भी चीज़ के लिए भद्दा है। –

+0

निश्चित रूप से हम कम से कम PHP 5.3 पर हैं, कोई भी अब स्ट्रिंग नहीं करता है, फ़ंक्शन कोड को अज्ञात फ़ंक्शन के रूप में आपूर्ति की जा सकती है। – Pacerier

5

मुझे एहसास है कि यह प्रश्न थोड़ा पुराना है, लेकिन Patchwork हाल ही में जारी किया गया PHP 5.3 प्रोजेक्ट है जो उपयोगकर्ता द्वारा परिभाषित कार्यों के पुनर्वितरण का समर्थन करता है। हालांकि, जैसा कि लेखक का उल्लेख है, आपको बंदर-पैच कोर/लाइब्रेरी फ़ंक्शंस में runkit या php-test-helpers का सहारा लेना होगा।

+2

बहुत अच्छा थोड़ा lib। साझा करने के लिए धन्यवाद :) –

1

जैसा कि jmikola का उल्लेख किया गया है, यदि आप किसी फ़ंक्शन में कोड जोड़ना चाहते हैं तो पैचवर्क एक अच्छा समाधान है। http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

यह कुछ नमूना कोड के साथ आता है:

यह ऐसे काम करता बारे में एक लेख है। मुझे लगता है कि phpmyweb संस्करण थोड़ा बेहतर कोड का उपयोग करता है, क्योंकि वह पैचवर्क के विपरीत eval() 'डी कोड का उपयोग नहीं करता है। Eval() का उपयोग करते समय आप opcodes कैश कर सकते हैं।

+0

जब आप यूनिट परीक्षण करते हैं तो आपको ऑपोड कैश के बारे में चिंता करने की आवश्यकता क्यों होती है? या क्या ... आप परीक्षण के अलावा कुछ और के लिए बंदर पैचिंग का उपयोग कर रहे हैं ?? उस स्थिति में आपको चिंता करने के लिए 'eval()' की तुलना में बड़ी समस्याएं हैं। – Spudley

+1

@ स्प्डली जाहिर है कि मैंने जो लेख पोस्ट किया है वह यूनिट परीक्षण की ओर लक्षित नहीं है (इसलिए शीर्षक "एक शानदार प्लगइन सिस्टम लिखें")। वह सिर्फ एक प्लगइन वास्तुकला बनाने के लिए एक और तरीका दिखा रहा है। और वह यह भी कहता है कि वह सिर्फ इस तरह के एक वास्तुकला बनाने का एक और तरीका दिखाना चाहता है। संभोग, यह एक अच्छा तरीका है, तो यह चर्चा के लिए है। हालांकि मुझे इसके साथ कोई समस्या नहीं दिख रही है। --- आप किस समस्या के बारे में सोच रहे हैं? लेखक की तरह, ओपोड कैशिंग को कोई समस्या नहीं होनी चाहिए क्योंकि eval() का उपयोग बिल्कुल नहीं किया जाता है (पैचवर्क के विपरीत)। – Vivendi

+0

@ विवेन्दी, क्या पैचवर्क आंतरिक रूप से रनकिट कार्यों का उपयोग करता है? – Pacerier

0

स्वीकार किए जाते हैं जवाब उत्कृष्ट है की कोशिश करता है !!! मैं बस जोड़ दूंगा, कि आप अपने कोड Namespace brackets में डाल सकते हैं और फिर डिफ़ॉल्ट ग्लोबल-स्पेस रीसेट हो जाता है।

कुछ अन्य तरीकों से:

1) rename_function($old_name,$new_name)

2) override_function($old_name, $parameters, $new_func)

और शायद ही कभी इस्तेमाल:

3) runkit_function_rename(...)

4) runkit_function_redefine(...)

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

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