2012-12-11 34 views
25

मेरे पास एक अमूर्त पैरेंट क्लास Mongo_Document (mongodb-php-odm से) और विरासत वर्ग Model_ActionPlan है। Mongo_Document में जादू __isset और __get विधियां हैं जो Mongo_Document कक्षा के अंदर एक सरणी के साथ बातचीत करती हैं।PHP चाइल्ड क्लास मैजिक __isset काम करता है लेकिन __get

मैं (Model_ActionPlan की एक विधि के अंदर से स्निपेट) निम्नलिखित कोड का उपयोग करने की कोशिश कर रहा हूँ: (। ध्यान दें कि close_type अगर status == 'closed' स्थापित किया जाना निश्चित है)

if (isset($this->status)) 
{ 
    if (($this->status === "closed") AND ($this->close_type != "failure")) 
    { 
     return; 
    } 
} 

isset कॉल रिटर्न true और उसके बाद निष्पादन अगले कथन में आता है। वहाँ, मैं निम्न त्रुटि प्राप्त:

Undefined property: Model_ActionPlan::$status 

हालांकि, अगर मैं $this->statusparent::__get('status') साथ, इस कोड अपेक्षित ढंग से काम करता है की जगह। ध्यान दें कि इसके अलावा सभी जगह कार्यक्रम में, मैं का उपयोग करने में सक्षम हूँ:

$ap = new Model_ActionPlan($plan_id); 
echo $ap->status; 
// Prints 'closed' (or 'active') as expected 

यह केवल यहाँ, वर्ग के अंदर ही है, कि यह काम नहीं करता।

मैंने चारों ओर देखा और मुझे लगता है कि कहीं भी ऐसा नहीं लगता है कि जादू वर्ग को बाल वर्ग में नहीं कहा जा सकता है। मैं इसके बजाय parent::__get कॉल का उपयोग कर सकता हूं लेकिन मुझे लगता है कि शायद ऐसा करने का गलत तरीका है। क्या किसी को पता है कि ऐसा करने का सही/बेहतर तरीका है?

अपडेट किया गया # 1 2012-12-16: माता पिता वर्ग से भरा कोड here on Github है।

अपडेट किया गया # 2 2012-12-18: लोग हैं, जो के बारे में जहां या क्या यह ठीक से सेट कर दिया जाता पूछा के लिए, जवाब है कि के बाद से बुला parent::__get('status') काम करता है, समस्या स्पष्ट रूप से नहीं है कि चर रहा है सेट नहीं हो रहा है। __get() को _object नामक एक निजी इंस्टेस वैरिएबल से अपना डेटा प्राप्त हो रहा है। अगर मैं var_dump($this), मुझे लगता है कि $this->_object['status'] अपेक्षित "बंद" मान के बराबर है।

# 3 अद्यतन: बच्चे वर्ग के कोड https://gist.github.com/4332062 पर उपलब्ध है। महत्वपूर्ण हिस्सा लाइन 69.


मैं this similar question देखा है पर शुरू होता है, लेकिन यह है कि एक माता-पिता जादू पद्धति का उपयोग करके बच्चे के गुण प्राप्त करने के बारे में है और अपनी समस्या माता पिता की गेटर उपयोग कर रहा है माता पिता के गुण प्राप्त करने के।

+0

PHP के कौन-सा संस्करण पर कर रहे हैं? ऐसा नहीं होना चाहिए। –

+0

मैं अपने परीक्षण सर्वर पर '5.4.8-NTS-VC9 (विंडोज FastCGI)' उपयोग कर रहा हूँ मेरी स्थानीय मशीन पर और '5.3.10-1ubuntu3.4'। समस्या दोनों पर होती है। –

+0

मैंने जादू विधियों के साथ बेस क्लास बनाकर इस मुद्दे को पुन: पेश करने का प्रयास किया है और फिर इसे विस्तारित किया है, लेकिन ऐसा लगता है कि आप जिस समस्या का सामना कर रहे हैं उसे प्रदर्शित नहीं कर रहा है। –

उत्तर

3

माता-पिता में __get समारोह कुछ जटिल है की

$this->_object['status'] 

बजाय प्रयोग नहीं करना चाहिए, तो मैं पूरी तरह से पता चल नहीं किया है चाहे निम्नलिखित हो रहा है या नहीं।यदि आपका __get फ़ंक्शन, जिसे एक बार बुलाया जाता है, किसी अन्य तरीके से किसी अन्य कॉल को अपने आप में ट्रिगर कर रहा है (शायद स्टैक पर अन्य कार्यों के लिए कुछ हस्तक्षेप करने वाली कॉल के साथ), यह वही होगा जो वास्तव में होगा। जब गेटर खुद के लिए एक कॉल से चलाता है

http://php.net/manual/en/language.oop5.overloading.php#55486, जो त्रुटि के ठीक उसी प्रकार से पता चलता लॉग इन किया जा रहा है। इस स्थिति में, यह पहचानना बहुत आसान है, लेकिन समारोह की तरह()) funcB करने के लिए) funcC करने के लिए() कुछ __get को ((__get करने के लिए() के एक अधिक जटिल कॉल ग्राफ के साथ, यह का पता आसानी से नहीं होगा।

+0

आप जानते हैं, आपके पास कुछ हो सकता है। मुझे यह जांचना होगा कि क्या हो रहा है।मुझे नहीं लगता कि '__get' खुद को बुला रहा है, लेकिन यह हो सकता है कि किसी अन्य प्रकार का "खुद को बुलावा" एक ही व्यवहार प्रदर्शित करता है। –

+0

दुर्भाग्यवश, मैं यह जांचने में असमर्थ था कि यह बकाया राशि समाप्त होने से पहले सही था या नहीं। मुझे माफ कर दो। हालांकि, मुझे यह कहना है कि यह लगभग निश्चित रूप से सही उत्तर है। मैंने कोड की एक पंक्ति को हटा दिया जो नेस्टेड कॉल को __get पर ले सकता है और इससे समस्या ठीक हो गई है। –

+0

स्वीट! खुशी है कि काम किया। – DWright

-3

सुनिश्चित नहीं हैं कि अगर मैं सही हूँ, लेकिन आप

$this->status 
+0

यह सच होगा अगर जादू गेटर केवल सरणी तत्व प्राप्त कर रहा था। हालांकि, ऐसी चीजें हैं जो '__get' विधि सरणी से तत्व प्राप्त करने से पहले करती हैं। मुझे यह सामान करने के लिए '--get' विधि का उपयोग करने की आवश्यकता है। इसके अतिरिक्त, मुझे लगता है कि यदि कोई विधि मौजूद है तो उचित पहुंच विधि का उपयोग करने के बजाय माता-पिता वर्ग के आंतरिक भाग के साथ खेलने के लिए यह बुरा अभ्यास है। यदि आप '$ - - _ _ ऑब्जेक्ट 'का उपयोग करते हैं और फिर मूल कार्यान्वयन में परिवर्तन होता है, तो आपको इसके बारे में चिंता करनी होगी। यदि आप दस्तावेजी विधियों का उपयोग करते हैं, तो आप नहीं करते हैं। –

+0

शायद एक टिप्पणी के लायक है क्योंकि यह एक निश्चित उत्तर से अधिक प्रश्न है। – Jimbo