2011-06-23 16 views
28
class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo parent::$bb; //Fatal error: Undefined class constant 'bb' 
    } 
} 

$test = new B($some); 
$test->childfunction(); 

प्रश्न: मैं बच्चे में पैरेंट वैरिएबल कैसे प्रदर्शित करूं? अपेक्षित परिणाम, 'माता-पिता bb'PHP अभिगम अभिभावक वर्ग परिवर्तनीय

उत्तर

50
echo $this->bb; 

चर विरासत में मिला है और निजी नहीं है गूंज जाएगा तो यह मौजूदा वस्तु का एक हिस्सा है।


यहाँ parent:: का उपयोग कर के बारे में अधिक जानकारी के लिए अपने अनुरोध के जवाब में अतिरिक्त जानकारी है:

उपयोग parent:: जब आप माता पिता वर्ग से एक पद्धति के लिए अतिरिक्त कार्यक्षमता जोड़ने चाहते हैं।

class Airplane { 
    private $pilot; 

    public function __construct($pilot) { 
     $this->pilot = $pilot; 
    } 
} 

अब मान लीजिए कि हम हवाई जहाज के एक नए प्रकार भी एक नाविक है बनाना चाहते हैं: उदाहरण के लिए, एक Airplane वर्ग की कल्पना। आप नए कार्यक्षमता जोड़ने के लिए __construct() विधि विस्तार कर सकते हैं, लेकिन अभी भी माता-पिता द्वारा की पेशकश की कार्यक्षमता का उपयोग करने के:

class Bomber extends Airplane { 
    private $navigator; 

    public function __construct($pilot, $navigator) { 
     $this->navigator = $navigator; 

     parent::__construct($pilot); // Assigns $pilot to $this->pilot 
    } 
} 

इस तरह, आप विकास के DRY principle पालन कर सकते हैं, लेकिन अभी भी सभी सेवाएं प्रदान कार्यक्षमता जो आप चाहते हैं।

+0

तो इसका मतलब है ** मूल ** कीवर्ड केवल मूल विधि तक पहुंचने के लिए उपयोग किया जाता है? – Kuntau

+1

आमतौर पर, जब आप किसी मूल विधि को ओवरराइड करना चाहते हैं, तो आप अभिभावक :: का उपयोग करेंगे, लेकिन फिर भी माता-पिता की कार्यक्षमता का संदर्भ लें। यदि आप केवल माता-पिता की विधि को कॉल करना चाहते हैं, तो आप वैरिएबल के लिए वही करते हैं: '$ this-> parentmethod()' –

1

$ बीबी अब क्लास ए के विस्तार के बाद कक्षा बी का निजी सदस्य बन गया है जहां इसे संरक्षित किया गया था।

तो यह है कि आप का उपयोग कर सकते $ bb वर्ग बी की एक विशेषता

class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo $this->bb; 
    } 
} 

$test = new B($some); 
$test->childfunction(); 
+0

कौन सा सही $ -> $ bb या $ this-> बीबी है? – Kuntau

+0

@ कंटो व्हाउप्स, टाइपो। $ This-> bb; सही है। मैंने ठीक कर दिया। विरासत और अभिभावक वर्गों में उपयोग किए जाने पर – FinalForm

4

बस इसे गूंज के बाद से यह विरासत में मिला है

echo $this->bb; 
0

सभी गुण और माता पिता के वर्ग के तरीकों में विरासत में मिला है बाल वर्ग इसलिए सैद्धांतिक रूप से आप उन्हें कक्षा वर्ग में एक्सेस कर सकते हैं लेकिन अपनी कक्षा में protected कीवर्ड का उपयोग करके सावधान रहें क्योंकि बच्चे वर्ग में उपयोग होने पर यह एक घातक त्रुटि फेंकता है।
php.net

में उल्लेख किया है एक संपत्ति या विधि की दृश्यता के रूप में सार्वजनिक खोजशब्दों के साथ घोषणा, संरक्षित या निजी लगाकर से परिभाषित किया जा सकता है। कक्षा के सदस्य घोषित लोगों को हर जगह तक पहुंचा जा सकता है। सदस्यों को सुरक्षित को केवल कक्षा के भीतर और विरासत में और माता-पिता कक्षाओं के भीतर एक्सेस किया जा सकता है। सदस्यों को के रूप में घोषित सदस्यों को केवल उस वर्ग द्वारा एक्सेस किया जा सकता है जो सदस्य को परिभाषित करता है।

+0

'संरक्षित' त्रुटियों को फेंक नहीं देता है। – T30

3

parent::$bb; के साथ आप स्थिर निरंतर $bb के मूल्य के साथ परिभाषित प्राप्त करने का प्रयास।

इसके बजाय, कार्य करें:

echo $this->bb; 

नोट: आप अगर B केवल वर्ग है कि यह कहता है parent::_construct कॉल करने के लिए की जरूरत नहीं है। बस बी कक्षा में __construct घोषित मत करो।

5
class A { 
    private $aa; 
    protected $bb = 'parent bb'; 

    function __construct($arg) { 
     //do something.. 
    } 

    private function parentmethod($arg2) { 
     //do something.. 
    } 
} 

class B extends A { 
    function __construct($arg) { 
     parent::__construct($arg); 
    } 
    function childfunction() { 
     echo parent::$this->bb; //works by M 
    } 
} 

$test = new B($some); 
$test->childfunction();` 
+3

'पैरेंट :: $ this-> बीबी' को पागलतम ऑब्जेक्ट-ओरिएंटेड सिंटैक्स होना चाहिए जो मैंने कभी देखा है – Tobia

+0

' parent :: 'parent :: $ this-> bb' में कुछ भी प्राप्त नहीं कर रहा है । मैं उत्तर की जटिलता को कम करने के लिए हटाने या आगे स्पष्टीकरण की सलाह देता हूं। – SEoF

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