2012-08-06 17 views
11

मैं मॉडलबच्चे के उदाहरण से पैरेंट फ़ंक्शन कैसे कॉल करें?

BaseUser.class.php 
User.class.php 
UserTable.class.php 

उपयोगकर्ता क्लास में मैं हटाने समारोह

class User extends BaseUser { 
    function delete(){ 
    } 
} 

ओवरराइड अब, अगर मैं माता-पिता समारोह को नष्ट कॉल करना चाहते हैं .... कैसे किया गया है?

<?php 
class A { 
    function example() { 
    echo "I am A::example() and provide basic functionality.<br />\n"; 
    } 
} 

class B extends A { 
    function example() { 
    echo "I am B::example() and provide additional functionality.<br />\n"; 
    parent::example(); 
    } 
} 

$b = new B; 

// This will call B::example(), which will in turn call A::example(). 
$b->example(); 
?> 

अपनी कक्षा एक नहीं है, तो:

उदाहरण

$user = new User(); 
$user->delete(); // will call the overridden delete 
$user-> ?? ;  // want to call parent delete 
+0

क्या आपने '$ user-> parent :: delete();'? – Matt

+0

हाँ, मैंने कोशिश की लेकिन यह काम नहीं किया .... netbeans इसे गलत अर्थशास्त्र के रूप में दिखाएं –

+0

जब आप अपने ब्राउज़र में कोड चलाते हैं तो क्या होगा? – Matt

उत्तर

28

तकनीकी रूप से यह अच्छे कारण के लिए "बाहरी" (सार्वजनिक इंटरफ़ेस) से संभव नहीं है।

class User extends BaseUser { 
    ... 
    function parentDelete(){ 
     parent::delete(); 
    } 
    ... 
} 

user = new User(); 
$user->delete(); // will call the overridden delete 
$user->parentDelete();  // want to call parent delete 

हालांकि अगर आप कभी भी ऐसा कर, आपको:

यदि आप क्यों (अन्यथा नीचे पढ़ें) को समझ लिया है, और आप वास्तव में पता है कि तुम क्या करते हैं, ऐसा कोई कारण नहीं वास्तव में कार्यक्षमता की पेशकश नहीं करने के लिए है जानते हैं कि आपने किसी भी तरह विरासत का दुरुपयोग किया है। यह एक असाधारण स्थिति होनी चाहिए क्योंकि मैं ऐसी किसी भी परिस्थिति की कल्पना नहीं कर सकता जहां आपको वास्तव में ऐसा करने की ज़रूरत है।

तो यह निर्धारित करने का प्रयास करें कि आपको उस कार्यक्षमता की आवश्यकता क्यों है ताकि आप बेहतर सुझाव दे सकें।

Why is that bad?

एक बहुत ही सरल कारण के लिए: अपने सॉफ़्टवेयर में आप को पता है $user एक माता पिता है या नहीं है कि जरूरत नहीं है। यह कुछ विवरण है जिस पर आपको परवाह नहीं करना चाहिए।

इससे आपको बाद में उपयोगकर्ता के बाल-बच्चे के साथ आपके सॉफ़्टवेयर में मौजूद किसी उपयोगकर्ता-ऑब्जेक्ट को प्रतिस्थापित करने की अनुमति मिल जाएगी। यह महत्वपूर्ण है क्योंकि आप समय के साथ अपने सॉफ्टवेयर को बदलना चाहते हैं।

यदि आप सार्वजनिक इंटरफ़ेस का आंतरिक विवरण हिस्सा बनाते हैं तो आप चीजों को लचीला रखने की संभावना को लुप्त कर रहे हैं। लचीला नहीं होना वास्तव में एक बुरी स्थिति है।

7

शायद इस

parent::delete(); 
+0

मेरे पास इस ऑब्जेक्ट पर कॉल करने के लिए उपयोगकर्ता $ उपयोगकर्ता का ऑब्जेक्ट है? –

+1

आपकी विधि को बाल विधि – voodoo417

+1

@HUGO में कॉल करना चाहिए: आप नहीं कर सकते। बाहर से दोनों एक ही हैं। दो नहीं हैं, लेकिन एक वस्तु है। यही वह विरासत है जिसके लिए विरासत है। – hakre

1

मुझे लगता है कि आप PHP parent कार्यों के लिए देख रहे हैं की कोशिश GetMyFunction() कोपर कॉल करने वाला फ़ंक्शनपेरेंट फ़ंक्शन को कॉल करेगा। यदि ऐसा होता है, तो यह बच्चे के फ़ंक्शन को कॉल करेगा, जब तक कि बच्चे फ़ंक्शन फ़ेंट फ़ंक्शन को कॉल न करे।

+0

ग्रेट ए :: उदाहरण() .... इस ऑब्जेक्ट पर इस फ़ंक्शन को कैसे कॉल करें $ b –

+0

मुझे लगता है कि ओपी को यह जानने की जरूरत है कि '$ b-> parent :: example(); 'काम करेगा। – Matt

+0

@HUGO $ b> उदाहरण() निम्न में निष्पादित होगा: यदि बच्चे वर्ग में कोई उदाहरण नहीं है, तो माता-पिता निष्पादित होंगे। यदि बच्चे में कोई फ़ंक्शन 'उदाहरण() 'है, तो इसके बजाय यह निष्पादित होगा। – Fluffeh

1

यदि आपको माता-पिता को एक बार कॉल करने की आवश्यकता है तो आपको delete का विस्तार करने की आवश्यकता क्यों है?

कस्टम डिलीट क्यों नहीं बनाते?

तरह:

public function customDelete() 
{ 
    parent::delete(); 

    // do extends delete here 
} 

तो फिर तुम एक वस्तु ->customDelete() का उपयोग कर नष्ट कर सकते हैं और आप भी माता पिता से हटाने की विधि कॉल के बाद से आप delete() विधि ओवरराइड नहीं किया जा सकता है:

$user = new User(); 
$user->customDelete(); // will call the overridden delete 
$user->delete(); // will call the parent (since you didn't override it) 

और यदि आप वास्तव में को delete() फ़ंक्शन को ओवरराइड करने की आवश्यकता है, तो भी आप एक प्रकार का अभिभावक हटा सकते हैं:

public function parentDelete() 
{ 
    return parent::delete(); 
} 

तब:

$user = new User(); 
$user->delete(); // will call the overridden delete 
$user->parentDelete(); // will call the method that only call the parent 
0

मैं codingforums पर this thread पाया। यह क्या कहता है (और मैं उनके साथ सहमत हूं) यह है कि यदि आपके पास बाल वर्ग में एक ओवरराइड फ़ंक्शन/विधि है, तो उस ऑब्जेक्ट का एक उदाहरण हमेशा बाल विधि को कॉल करेगा।

parent कीवर्ड $this या self जैसा है और इसे केवल कक्षा के भीतर से ही बुलाया जा सकता है।

आप एक बच्चे वस्तु माता पिता विधि कॉल करने में सक्षम होना चाहते हैं, तो बस एक और तरीका

function parentExample() { 
    parent::example(); 
} 

जो केवल माता-पिता प्रणाली को बुलाती पैदा करते हैं।

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