2010-06-21 5 views
6

PHP में _get और _set फ़ंक्शंस निर्मित हैं। क्या यह प्रत्येक चर के लिए अपना स्वयं का काम लिखना और सेट करना बेहतर है या यदि किसी और के टन के साथ अंतर्निहित कार्यों का उपयोग करना बेहतर है? प्रत्येक विधि के पेशेवरों और विपक्ष क्या हैं?PHP की _get और _set या अद्वितीय प्रत्येक चर के लिए फ़ंक्शन प्राप्त करें और सेट करें?

+0

यदि आप समझाते हैं कि आपको केवल '__get' और '__set' का उपयोग करने की आवश्यकता क्यों है, तो केवल सार्वजनिक फ़ील्ड के विपरीत। आप हमेशा बाद में '__get' और' __set' में बदल सकते हैं। –

+0

मैं यह जांचने में सक्षम होना चाहता हूं कि डेटा कानूनी है और डेटाबेस में सहेजे जाने से पहले कुछ डेटा को सुधारने की आवश्यकता है, –

उत्तर

4

__get और __set जादू विधियां हैं जिनका उपयोग आमतौर पर डिजाइन आधार के रूप में उपयोग करने के बजाय कठिन समस्याओं को हल करने के लिए किया जाना चाहिए।

उदाहरण के लिए, मैंने खुद को एक परियोजना पर पाया जहां मुझे ऐसी साइट का विश्लेषण करना पड़ा जो ओओपी का उपयोग गहरी विरासत (> 2) के साथ किया गया था और महत्वपूर्ण बेस क्लास में से एक सार्वजनिक संपत्ति थी जिसे name कहा जाता था। हालांकि, इसमें गेटर्स और सेटर्स भी थे (getName, setName) जिसने उस संपत्ति को प्राप्त करने और इसे स्थापित करने के केवल उद्देश्य के लिए उपयोग किया। getName नामक कई वर्गों और बस name संपत्ति को सीधे एक्सेस किया गया! महान डिजाइन नहीं है।

जादू विधियों ने मुझे पर संपत्ति का नाम बदलकर समस्या को हल करने की अनुमति दी और इसे निजी बनाने के लिए, गेटर्स और सेटर्स के माध्यम से संपत्ति के सभी अनुरोधों को मजबूर कर दिया।

यह कहा जा रहा है कि अगर आप एक चर जैसे संपत्ति का इलाज कर रहे हैं तो गेटर्स और सेटर्स की कोई आवश्यकता नहीं है। उस मामले में, बस संपत्ति सार्वजनिक करें!

आपके मामले में, चूंकि सत्यापन/स्वच्छता चल रही है, इसलिए आपको गेटर्स और सेटर्स को नियोजित करना चाहिए और उन्हें विधिओं के रूप में सीधे कोड करना चाहिए (जादू की विधियों से अनावश्यक रूप से ओवरहेड करने के बजाए)।

+0

मुझे लगता है कि वहां बहुत बड़ी संख्या में स्थान थे जहां $ इंस्टेंस -> नाम किया जा रहा था, सही? क्योंकि मैं व्यक्तिगत रूप से सोचता हूं कि कक्षाओं को बदलने के लिए बेहतर होगा, जो इसके बजाय getName()/setName() का उपयोग करें और $ name संरक्षित करें। मुझे लगता है कि आप अपने __get और __set विधियों को E_NOTICE या E_DEPRECATED जारी करते समय कॉल कर सकते हैं, इस तरह की सामग्री अभी भी काम करेगी लेकिन आपको सतर्क किया जाएगा कि आप इसे सेटर्स/गेटर्स के माध्यम से नहीं कर रहे थे। हालांकि यह सिर्फ मुझे है। – GordonM

2

मुझे नियम है कि यदि आपके पास जटिल जटिलता है या सेट सेट है तो एक अलग प्राप्त करें या सेट विधि जोड़ें। यदि आप कुछ आसान कर रहे हैं तो आप या __set का लाभ उठा सकते हैं जब आप अन्यथा कस्टम कस्टम/सेट विधियों में खुद को दोहराएंगे।

3

यहां इस समस्या को संभालने का तरीका बताया गया है।

final public function __set($key, $value) { 
    $method = 'set' . ucfirst($key); 
    if (method_exists($this, $method)) { 
     $this->data[$key] = $this->$method($value); 
    } else { 
     $this->data[$key] = $value; 
    } 
    } 


    final public function __get($key) { 
    $method = 'get' . ucfirst($key); 
    if (method_exists($this, $method)) { 
     return $this->$method($this->data[$key]); 
    } else { 
     return $this->data[$key]; 
    } 
    } 

आप एक संपत्ति के लिए एक कस्टम हैंडलर, यह कहा जाता हो जाता है, तो (यह मानते हुए यह getProperty नामित है)। अन्यथा, डिफ़ॉल्ट प्राप्त/सेट जादू विधि का उपयोग किया जाता है।

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