2011-09-19 23 views
12

से बच्चे संपत्ति मैं अपने बच्चे के गुण का उपयोग करने के एक माता पिता के वर्ग की जरूरत है:पहुँच माता पिता गुंजाइश

class Parent { 
    private $_fields = null; 

    public function do_something() { 
    // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    private $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 

जब $_fields बच्चे दायरे से संशोधित किया गया है, यह अभी भी माता-पिता के दायरे में null है। $this->child_var का उपयोग करके मूल दायरे से $ child_var तक पहुंचने का प्रयास करते समय, यह निश्चित रूप से अनिर्धारित है।

मैं एक "समारोह सेट" कि सिर्फ बच्चे कक्षा में कॉपी किया जा होगा की तरह कुछ भी नहीं मिला ...

+4

आप शायद गुण '' बजाय private' की protected' बनाना चाहते हैं। –

उत्तर

9

एक लेख के बारे में visibility पर एक नजर डालें।

असल में, आप माता-पिता के private गुण/विधियों तक नहीं पहुंच सकते हैं और न ही माता-पिता अपने बच्चे तक पहुंच सकते हैं। हालांकि, आप इसके बजाय अपनी संपत्ति/विधि protected घोषित कर सकते हैं।

class Parent { 
    protected $_fields = null; 

    public function do_something() { 
     // Access $_fields and $child_var here 
    } 
} 

class Child extends Parent { 
    protected $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 
+0

धन्यवाद! मुझे इसी की तो तलाश थी। ऐसा लगता है कि मैंने पर्याप्त दस्तावेज नहीं पढ़ा था। –

6

बेस (पैरेंट) कक्षा से बाल मूल्यों तक पहुंचने का प्रयास करना एक खराब डिज़ाइन है। क्या होगा यदि भविष्य में कोई आपके माता-पिता वर्ग के आधार पर एक और कक्षा बनाएगा, तो उस विशिष्ट संपत्ति को बनाना भूल जाएं जिसे आप अपने मूल वर्ग में एक्सेस करने का प्रयास कर रहे हैं?

आप की तरह है कि आप एक माता पिता के वर्ग में संपत्ति बनाने चाहिए कुछ करना है, और फिर बच्चे में यह स्थापित करने के लिए की जरूरत है:

class Parent 
{ 
    protected $child_var; 

    private $_fields = null;  
    public function do_something() 
    {  
     // Access $_fields and $child_var here 
     //access it as $this->child_var 
    } 
} 
class Child extends Parent 
{ 
    $child_var = 'hello'; 
} 

$child = new Child(); 
$child->do_something(); 
मूल रूप से माता-पिता आप का संदर्भ नहीं चाहिए बाल-विशिष्ट सामग्री में

, आप क्योंकि यह सुनिश्चित नहीं हो सकता है कि यह वहां होगा!

आप के लिए है, तो आप अमूर्त का उपयोग करना चाहिए:

PHP Abstraction

+0

अच्छा, मुझे पता है कि यह एक बुरा अभ्यास है, लेकिन यह एक बहुत ही विशिष्ट मामला है जिसकी वास्तव में आवश्यकता है। वैसे भी आपके उत्तर के लिए धन्यवाद। –

+0

मैं समस्या को समझता हूं, लेकिन यह समाधान अभी भी मुझे जोखिम भरा दिख रहा है। हम एक निश्चित संपत्ति को परिभाषित करने के लिए बाल वर्ग को कैसे लागू कर सकते हैं? मेरे पास अमूर्त माता-पिता वर्ग में एक ठोस कार्य है जिसके लिए एक निश्चित संपत्ति की आवश्यकता होती है। अभी मैं $ - का उपयोग कर रहा हूं-> अभिभावक वर्ग में बालप्रोपर्टी और यह आपके द्वारा हाइलाइट किए गए एक ही मुद्दे को चलाता है। –

+0

आप '$ child_var' सार बना सकते हैं। इससे किसी भी बच्चे को वास्तव में इसे लागू करने के लिए लागू किया जाएगा। –

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