मैं वर्तमान में ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां कोर सिस्टम कई अलग-अलग ग्राहकों को वितरित किया जाता है - और फिर क्लाइंट अनुरोध में बदलाव होना चाहिए, हमें उन्हें प्रत्येक सिस्टम पर व्यक्तिगत रूप से बनाना होगा अंत में कोर कोड क्लाइंट से ग्राहक में भिन्न होता है, और इसे अद्यतित रखता है और सिस्टम में नई सुविधाओं की प्रतिलिपि बनाना मुश्किल होता है।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 है)।
- मुझे लगता है कि कक्षाओं में एक ही नाम है जब
- मैं एक विधि है कि माता-पिता वर्ग बाद में कॉल ओवरराइड करने के लिए प्रयास कर रहा है, यह प्रयोग करेंगे मैं मुसीबत में चलेंगे: हालांकि मैं इस विधि के साथ दो मुद्दे हैं यह विधि का अपना संस्करण है जिसके विपरीत मैं
- ओवरराइड करने का प्रयास कर रहा हूं, हालांकि 'सरल' समाधान यह कहना है कि आपको संयोजन के साथ किसी भी तरीके को ओवरराइड करना चाहिए, लेकिन बाद की तारीख में अधिक जोड़ा जा सकता है।
वर्तमान में मैं सिर्फ पूर्ण वर्ग लोडर, जो काम करता है और कम जटिल है का उपयोग कर अधिभावी की प्रारंभिक समाधान करने के लिए कोशिश कर रहा हूँ।
हालांकि मुझे आश्चर्य हुआ कि क्या स्टैक ओवरफ्लो पर किसी भी महान दिमाग को किसी भी उत्तर या सेट-अप के बारे में पता हो सकता है जो विधि ओवरराइडिंग विचार के साथ मुद्दों को हल करने में मदद कर सकता है - कृपया ध्यान रखें कि मैं मौजूदा सिस्टम सेट अप के साथ काम कर रहा हूं , हालांकि कंकाल संरचना विचार वह है जो मैं बदल रहा हूं पर कुछ 'नियंत्रण' लाने के लिए लागू करने की कोशिश कर रहा हूं। आदर्श रूप से, जब कोई व्यक्ति किसी विधि या समान को ओवरराइड करना चाहता है तो कोर में कुछ भी नहीं बदलेगा (कम से कम नहीं)।
मैं [FuelPHP Framework] (http://fuelphp.com/) डाउनलोड करने की अनुशंसा करता हूं और यह देखने के लिए उनके कोड को देखता हूं कि उन्होंने इस प्रकार के मुद्दों को कैसे हल किया। – PhearOfRayne
आप इसके लिए 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 –
@StevenFarley लिंक के लिए चीयर्स! – Dan