2012-12-20 11 views
10

मैं वर्तमान में ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां कोर सिस्टम कई अलग-अलग ग्राहकों को वितरित किया जाता है - और फिर क्लाइंट अनुरोध में बदलाव होना चाहिए, हमें उन्हें प्रत्येक सिस्टम पर व्यक्तिगत रूप से बनाना होगा अंत में कोर कोड क्लाइंट से ग्राहक में भिन्न होता है, और इसे अद्यतित रखता है और सिस्टम में नई सुविधाओं की प्रतिलिपि बनाना मुश्किल होता है।PHP क्लास और विधि ओवरराइडिंग - कॉलबैक लागू करें

मैंने प्रस्तावित किया है कि हम एक 'ओवरराइड मॉडल' पर जाएं (जिसे मैं कॉल कर रहा हूं) जिसमें कोड की बाहरी कंकाल संरचना है। कुछ हद तक की तरह:

|- controllers 
|- models 
|- views 
|- core 
    |- controllers 
     |- Controller1.php 
    |- models 
    |- views 

यदि आप तो Controller1.php में परिवर्तन, आप इसे बाहर संरचना में नक़ल की और बनाने के परिवर्तन करने के लिए करना चाहता था - एक autoloader फिर उचित फ़ाइलें लोड होता अगर वे कंकाल संरचना की जाँच करके मौजूद उन्हें पहले, के लिए यानी

Loader::controller('Controller1'); 

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

class Override { 

public function __call($method, $args) { 
    return call_user_func_array(array('Something', $method), $args); 
} 

public static function __callStatic($method, $args){ 
    return call_user_func_array(array('Something', $method), $args); 
    } 

} 

// Core class 
class Something { 

    static function doTest() { 
     echo "Class something <br/>"; 
    } 

    static function doOtherTest() { 
     echo "That works <br/>"; 
     self::doTest(); 
    } 

} 


// Overriding class - named differently for ease of example and reasons explained later 
class SomethingElse extends Override { 

    private static function doTest() { 
     echo "Success <br/>"; 
    } 

} 

// Actual function calling 
SomethingElse::doTest(); 
SomethingElse::doOtherTest(); 

सामान्य विचार किया जा रहा है कि अगर विधि प्रारंभिक कक्षा में मौजूद नहीं है, फिर 'माता-पिता' वर्ग से यह कार्रवाई (जो यहाँ hardcoded है)।

  • मुझे लगता है कि कक्षाओं में एक ही नाम है जब
  • मैं एक विधि है कि माता-पिता वर्ग बाद में कॉल ओवरराइड करने के लिए प्रयास कर रहा है, यह प्रयोग करेंगे मैं मुसीबत में चलेंगे: हालांकि मैं इस विधि के साथ दो मुद्दे हैं यह विधि का अपना संस्करण है जिसके विपरीत मैं
    • ओवरराइड करने का प्रयास कर रहा हूं, हालांकि 'सरल' समाधान यह कहना है कि आपको संयोजन के साथ किसी भी तरीके को ओवरराइड करना चाहिए, लेकिन बाद की तारीख में अधिक जोड़ा जा सकता है।

वर्तमान में मैं सिर्फ पूर्ण वर्ग लोडर, जो काम करता है और कम जटिल है का उपयोग कर अधिभावी की प्रारंभिक समाधान करने के लिए कोशिश कर रहा हूँ।

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

+1

मैं [FuelPHP Framework] (http://fuelphp.com/) डाउनलोड करने की अनुशंसा करता हूं और यह देखने के लिए उनके कोड को देखता हूं कि उन्होंने इस प्रकार के मुद्दों को कैसे हल किया। – PhearOfRayne

+0

आप इसके लिए statics का उपयोग क्यों कर रहे हैं? एमवीसी के पूरे बिंदु में पुन: प्रयोज्य/प्रतिस्थापन योग्य घटक हैं। स्टेटिक्स कसकर सबकुछ जोड़ते हैं। डिजाइन के दृष्टिकोण से यह एक बहुत ही बुरी चीज है। देखें: http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/ और http://stackoverflow.com/questions/9560484/static-methods-or-not/11933130 # 11933130 –

+0

@StevenFarley लिंक के लिए चीयर्स! – Dan

उत्तर

1

अच्छी तरह से सख्त ओओ प्रकार का समाधान निश्चित रूप से आपके नियंत्रक को अमूर्त इंटरफेस के रूप में फैलाना होगा जो कई अलग-अलग वास्तविक दुनिया दृष्टिकोणों द्वारा कार्यान्वित किया जा सकता है और फिर विरासत सिद्धांत पर संरचना द्वारा एक साथ लाया जा सकता है।

जैसा कि मैं समझता हूं कि आपके पास मौजूदा कोड है जो आप ओवरराइड या विस्तार करना चाहते हैं। अपने PHP-संस्करण आप लक्षण का उपयोग करने की अनुमति देता है, तो यह आपके भी मदद कर सकता है:

PHP 5.4: why can classes override trait methods with a different signature?

+0

एसवी बोकेनहम ने लिखा है कि हम यह कैसे करेंगे, लेकिन मैं इसे सही उत्तर के रूप में चिह्नित कर रहा हूं हमें समाधान के लिए क्या नेतृत्व किया। – Dan

3

खैर हम सिर्फ इसका समाधान कर लिया। यह लक्षण है!

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

+3

यह पहली असली दुनिया और गैर-मूर्खतापूर्ण कारण है जिसे मैंने ट्राइट्स, अच्छी नौकरी का उपयोग करने के लिए देखा है। –

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