2010-11-08 15 views
8

मैं PHP सीख रहा हूं और कुछ आश्चर्यजनक व्यवहार पाया जब मैं यह पता लगाने की कोशिश कर रहा था कि एक निर्माता को क्यों नहीं बुलाया जा रहा था।क्या मैं अभिभावक के निर्माता का उपयोग करने के लिए एक बाल वर्ग को मजबूर कर सकता हूं?

<?php 
    class Shape { 

     function __construct() { 
      echo 'Shape.'; 
     } 
    } 

    class Triangle extends Shape { 

     function __construct() {   
      echo 'Triangle'; 
     } 
    } 

    $tri = new Triangle(); 
?> 

मुझे जावा में उपयोग किया जाता है, इसलिए मैंने सोचा कि यह "आकार। त्रिकोण" आउटपुट होगा। आश्चर्य की बात है, यह सिर्फ "त्रिकोण" आउटपुट करता है। मैंने समस्या की खोज की और स्पष्ट रूप से मैं बच्चे वर्ग में parent::__construct(); डालकर इसे ठीक कर सकता हूं, लेकिन यह आदर्श प्रतीत नहीं होता है। क्या यह सुनिश्चित करने के लिए कि बाल कक्षाएं हमेशा माता-पिता कन्स्ट्रक्टर को कॉल करती हैं, आकार के वर्ग में कुछ भी कर सकता हूं? जब भी माता-पिता के पास कोई कन्स्ट्रक्टर होता है तो क्या मुझे वास्तव में parent::__construct(); प्रत्येक बच्चे की कक्षा में लिखना होगा?

+1

मुझे यकीन है कि आपको यह सुनिश्चित करना होगा कि जब तक आप बच्चे के निर्माता को परिभाषित नहीं करते हैं। –

+0

संभावित डुप्लिकेट [क्या सुपरक्लास का कन्स्ट्रक्टर PHP में बाल कन्स्ट्रक्टर के अंदर चलाया जाता है?] (Http://stackoverflow.com/questions/738571/is-superclasss-constructor-run-inside-child-constructor-in-php) – outis

उत्तर

10

यदि आप एक बच्चे के वर्ग में एक ही नाम की विधि परिभाषित करते हैं, तो माता-पिता की विधि ओवरराइड हो जाती है और किसी भी परिस्थिति में तब तक नहीं कहा जाएगा जब तक कि आप स्पष्ट रूप से ऐसा न करें। आईई .: नहीं, इसके बारे में आप कुछ भी नहीं कर सकते हैं, आपको parent::__constructor() को स्पष्ट रूप से कॉल करना होगा।

+0

+1 जोड़ने के लिए और कुछ नहीं। – Hamish

+1

आप माता-पिता को एक सार या खाली प्रारंभिक विधि घोषित कर सकते हैं जो अभिभावक कन्स्ट्रक्टर कॉल करता है। – erisco

+0

@ सिस्को यह चारों ओर काम करने के लिए एक अच्छा डिजाइन पैटर्न होगा, लेकिन यह तथ्यों को नहीं बदलता है। :) – deceze

2

पीएचपी मैनुअल के अनुसार:

Parent constructors are not called implicitly if the child class defines 
a constructor. In order to run a parent constructor, a call to 
parent::__construct() within the child constructor is required. 
8

PHP 5 के रूप में, आप अधिरोहित किया जा रहा से एक माता पिता के विधि को रोकने के लिए final keyword उपयोग कर सकते हैं।

<?php 
class BaseClass { 
    public function test() { 
     echo "BaseClass::test() called\n"; 
    } 

    final public function moreTesting() { 
     echo "BaseClass::moreTesting() called\n"; 
    } 
} 

class ChildClass extends BaseClass { 
    public function moreTesting() { 
     echo "ChildClass::moreTesting() called\n"; 
    } 
} 
// Results in Fatal error: Cannot override final method BaseClass::moreTesting() 

आप एक पूर्व निर्धारित init() विधि के साथ संयोजन में इस का उपयोग सुनिश्चित करने के लिए अपने माता पिता के निर्माता कहा जाता था सकता है।

<?php 
abstract class Shape { 

    final function __construct() { 
     $this->init(); 
     echo 'Shape.'; 
    } 

    abstract public function init(); 
} 

class Triangle extends Shape { 

    function init() {   
     echo 'Triangle'; 
    } 
} 

$tri = new Triangle(); 

यह आउटपुट होगा

TriangleShape. 

यदि आप दस्तावेज़ क्या init() विधि करता है, और जहां यह माता-पिता में कहा जाता है यह केवल इस तरह की एक डिजाइन का प्रयोग उचित है।

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

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