2010-11-07 15 views
6

हाय मेरे पास $ $ के बारे में एक प्रश्न है।PHP कक्षाएं

class foo { 

    function __construct(){ 

     $this->foo = 'bar'; 

    } 

} 

class bar extends foo { 

    function __construct() { 

     $this->bar = $this->foo; 

    } 

} 

होगा

$ob = new foo(); 
$ob = new bar(); 
echo $ob->bar; 

bar में परिणाम ??

मैं केवल इसलिए सोचता हूं कि मैंने सोचा था कि यह मेरी स्क्रिप्ट के अलावा मुझे लगता है कि परिणाम में ऐसा नहीं लगता है।

उत्तर

10

के शब्दों में PHP manual:

नोट: जनक कंस्ट्रक्टर्स कहा जाता है नहीं कर रहे हैं परोक्ष अगर बच्चे कक्षा एक निर्माता परिभाषित करता है। अभिभावक कन्स्ट्रक्टर चलाने के लिए, पर कॉल करने के लिए अभिभावक :: __ निर्माण() बाल कन्स्ट्रक्टर के भीतर आवश्यक है।

इसका मतलब यह है कि आपके उदाहरण में जब bar रनों का निर्माता है, यह foo के निर्माता नहीं चलता है, तो $this->foo अभी भी अनिर्धारित रहता है।

5

PHP parent constructor is not automatically called if you define a child constructor में थोड़ा अजीब है - आपको इसे स्वयं कॉल करना होगा। इस प्रकार, अपने इच्छित व्यवहार को प्राप्त करने के लिए, यह

class bar extends foo { 

    function __construct() { 

     parent::__construct(); 
     $this->bar = $this->foo; 

    } 

} 
+0

एक छोटी सी अजीब है, लेकिन बहुत लचीला के बाद से आप आसानी से सभी पर ओवरलोड नहीं कर सकते हैं (केवल माता-पिता कहते हैं) , आंशिक रूप से कन्स्ट्रक्टर को अधिभारित करें (इसे नए के भीतर से बुलाएं) या इसे पूरी तरह अधिभारित करें (इसे बिल्कुल कॉल नहीं करना)। तो यह अन्य भाषाओं की तुलना में अजीब है, इसका मतलब यह नहीं है कि यह ऐसा करता है (यह एक बड़ा लाभ के रूप में देखा जा सकता है) ... – ircmaxell

+0

तो $ इसका कोई अर्थ नहीं है विस्तारित वर्ग कहा जाता है? मैंने सोचा कि यह $ इसके साथ अपनी वस्तुओं को ले जाएगा। –

+0

नहीं, $ यह वर्तमान उदाहरण को संदर्भित करता रहा है –

0

आप दोनों foo और bar का उदाहरण नहीं बनाते हैं। बार का एक उदाहरण बनाएँ।

$ob = new bar(); 
echo $ob->bar; 

और अन्य उत्तर के रूप में बताया है, कॉल माता पिता :: __ निर्माण() अपने बार निर्माता भीतर

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