PHP

2010-06-20 8 views
28

में बाल कन्स्ट्रक्टर से पहले अभिभावक कन्स्ट्रक्टर को कॉल करें, मैं सोच रहा था कि क्या माता-पिता __construct() को PHP में विरासत के साथ बच्चे के __construct() से पहले कॉल करना संभव है।PHP

उदाहरण:

class Tag { 
    __construct() { 
     // Called first. 
    } 
} 

class Form extends Tag { 
    __construct() { 
     // Called second. 
    } 
} 

new Form(); 

आदर्श रूप में, मैं उन दोनों के बीच में कुछ करने के लिए सक्षम होगा। यदि यह संभव नहीं है, तो क्या कोई विकल्प है, जो मुझे ऐसा करने की अनुमति देगा?

कारण यह है कि मैं ऐसा करना चाहता हूं टैग के लिए विशिष्ट डिफ़ॉल्ट सेटिंग्स का एक गुच्छा लोड करने में सक्षम होना चाहिए, जब फॉर्म __construct() कहा जाता है।

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

यह वह जगह है कि मैं क्या करना चाहते हैं:

$tag = new Tag($privateInfo, $publicInfo); 
$tag->extend(new Form()); // Ideal function, prob doesn't work with inheritance. 

Tag.php

class Tag { 
    private $privateInfo; 
    public $publicInfo; 
    __construct($private, $public) { 
     $this->privateInfo = $private; 
     $this->publicInfo = $public; 
    } 
} 

Form.php

class Form extends Tag { 

    __construct() { 
     echo $this->publicInfo; 
    } 
} 

समझ में आओ?

धन्यवाद! मैट मुलर

+0

आप आप इस से क्या मतलब * पर विस्तृत कर सकते हैं 'कुछ निजी डेटा (माता-पिता के लिए) बच्चे को उजागर करता है' *? –

+2

अभिभावक वर्ग का निजी डेटा किसी भी उप-वर्ग के संपर्क में नहीं आएगा। सार्वजनिक या संरक्षित डेटा, निजी नहीं होगा। –

+0

याहू, लेकिन अगर (निजी) पैरामीटर पहले बच्चे के कन्स्ट्रक्टर के माध्यम से जाते हैं, तो बच्चे को उनके पास पहुंच है। मैंने इसे स्पष्ट करने के लिए संपादित किया। – Matt

उत्तर

46

बस माता-पिता को फोन :: __ बच्चे में निर्माण।

class Form extends Tag 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     // Called second. 
    } 
} 
+1

आह क्षमा करें। मैं यह जोड़ना भूल गया कि मेरे पास बच्चे के कन्स्ट्रक्टर में नहीं होगा। कृपया संपादन पढ़ें। – Matt

+0

ने फैसला किया कि यह विकल्प का सबसे अच्छा था। दुर्भाग्य से, यह वही नहीं है जो मैं चाहता था - ओह ठीक है .. धन्यवाद! – Matt

+0

ओह वाह डेनिस, आप वास्तव में पिछले कुछ दिनों में मेरी मदद कर रहे हैं .. धन्यवाद आदमी! – Matt

3

हाँ सिर्फ फोन parent::__construct() अपने निर्माण में

+0

आह क्षमा करें मैं एक आवश्यकता शामिल करना भूल गया ... कृपया अद्यतन के लिए संपादन पढ़ें। – Matt

+2

ऐसा करने का तरीका है, अगर आप सहमत नहीं हैं तो बस ओओपी मैनुअल पढ़ें। पहिया को फिर से शुरू करने की कोशिश मत करो। अगर आपको अपने मॉडल के बारे में चिंता है, तो यह भी देखने के लिए कि आपने यह कैसे किया है, उसे पोस्ट करने का प्रयास करें। शायद आप एक खराब डिजाइन तकनीक कर रहे हैं। – Pentium10

+0

मैं पहिया को फिर से शुरू करने की कोशिश नहीं कर रहा हूं ... मैं अपनी आवश्यकताओं का हल करने की कोशिश कर रहा हूं। – Matt

3

हाँ, पर केवल आंतरिक रूप से (यानी, एक PHP एक्सटेंशन लिख कर), तो अगर मैं तुम्हें थे मैं parent::__construct() बुला के साथ बसने चाहते हैं। PHP विकी पर this section देखें।

क्षमा करें, PHP जावा नहीं है। मुझे लगता है कि सुपर कन्स्ट्रक्टर को बुलाए जाने की आवश्यकता नहीं है (स्पष्ट रूप से या स्पष्ट रूप से) एक बहुत ही खराब डिजाइन निर्णय था।

1

इसकी आवाज़ से आप अपने डिज़ाइन पर पुनर्विचार करना चाहेंगे ताकि आपको कन्स्ट्रक्टर में पैरामीटर पास करने की आवश्यकता न हो। यदि आपको नहीं लगता कि यह किया जा सकता है, तो इसे एक प्रश्न के रूप में पूछें, आप कुछ सुझावों से आश्चर्यचकित हो सकते हैं।

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

class Father { 
    private $_privateData; 
    final function setPrivateData($privateData) { 
     $this->_privateData = $privateData; 
    } 
} 

एक और तो सिफारिश नहीं की, अधिक "पहिया पुनर्रचना", समाधान माता पिता कक्षा में एक समारोह को परिभाषित करने के होगा, कहना _construct(), कि अपने स्वयं के निर्माण में कहा जाता है। यह वास्तव में स्पष्ट नहीं है, भाषा सुविधाओं/संरचनाओं का उपयोग नहीं करता है, और यह एक ही आवेदन के लिए बहुत विशिष्ट है।

ध्यान रखने योग्य एक आखिरी बात: आप वास्तव में बाल वर्ग से जानकारी छिपा नहीं सकते हैं।प्रतिबिंब, क्रमानुसार, var_dump, var_export और इन सभी अन्य सुविधाजनक एपीआई php भाषा में साथ है, अगर वहाँ कोड है कि डेटा के साथ कुछ भी ऐसा नहीं करना चाहिए है, तो वहाँ नहीं वास्तव में बहुत आप इसे दुकान नहीं से asides कर सकता है। पुस्तकालय हैं और ऐसे हैं जो सैंडबॉक्स बनाने में मदद करते हैं, लेकिन अपने आप से ऑब्जेक्ट को सैंडबॉक्स करना मुश्किल है।

संपादित करें: किसी तरह मैं Artefacto के जवाब याद किया, और मुझे लगता है कि वह सही है (मैं कभी नहीं करने के लिए एक विस्तार के लेखन की कोशिश की है)। फिर भी, को लागू करने में यह डेवलपर उम्मीदों टूट जाता है, जबकि यह वास्तव में देखने के कोड की व्याख्या करने के लिए क्या हो रहा है में करने के लिए कठिन बना रही है।

+0

अरे, आपकी प्रतिक्रिया के लिए धन्यवाद। दुर्भाग्यवश इस विषय को हाथ से थोड़ा सा मिला, जो मेरी गलती है। वैसे भी, मैं इसे फिर से डिजाइन करने की कोशिश कर रहा हूं। मेरे पास आपके उत्तर के बारे में एक सवाल है ... आप यह कैसे कर सकते हैं - "बाल वर्ग में इसे बिना कॉल किए माता-पिता कन्स्ट्रक्टर को ओवरराइड करने की क्षमता है।" – Matt

+0

@ मैट आप केवल PHP कोड का उपयोग नहीं कर सकते हैं। व्युत्पन्न वर्ग को लिखने वाले व्यक्ति में माता-पिता कन्स्ट्रक्टर को बिल्कुल कॉल करने की क्षमता नहीं है। प्रोजेक्ट के लिए आप क्या कर सकते हैं, एक और फ़ंक्शन परिभाषित किया गया है जिसे मूल निर्माता द्वारा अपने कन्स्ट्रक्टर में बुलाया जाता है, _construct() कहें जो माता-पिता परिभाषित करता है और कॉल करता है। – Reece45

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

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