2013-06-18 20 views
5

में किसी वर्ग के बाहर संरक्षित फ़ंक्शन को कॉल करें मेरे पास एक संरक्षित फ़ंक्शन है जिसे किसी निश्चित वर्ग के भीतर परिभाषित किया गया है। मैं इस संरक्षित फ़ंक्शन को किसी अन्य फ़ंक्शन के भीतर कक्षा के बाहर कॉल करने में सक्षम होना चाहता हूं। यह संभव है और यदि ऐसा है तो मैं इसे कैसेक्या मैं/कैसे कर सकता हूं ... PHP

class cExample{ 

    protected function funExample(){ 
    //functional code goes here 

    return $someVar 
    }//end of function 

}//end of class 


function outsideFunction(){ 

//Calls funExample(); 

} 
+2

आप नहीं कर सकते हैं:

यहां एक त्वरित प्रतिबिंब उदाहरण है, मामले में यह जहां यह वास्तव में आवश्यक है बहुत कुछ स्थितियों में से एक है। इससे पहले स्थान पर संरक्षित कार्य करने के उद्देश्य को हराया जाएगा।आपके पास एक सार्वजनिक विधि हो सकती है जो आपकी ओर से संरक्षित विधि का आह्वान करती है, लेकिन फिर एक संरक्षित विधि क्यों शुरू होनी चाहिए? –

+0

http://stackoverflow.com/q/12255740/2088851 का डुप्लिकेट – Voitcus

उत्तर

8

OOP की बात है कि लक्ष्य को हासिल कर सकते हैं - कैप्सूलीकरण:

निजी

Only can be used inside the class. Not inherited by child classes. 

संरक्षित

Only can be used inside the class and child classes. Inherited by child classes. 

लोक

Can be used anywhere. Inherited by child classes. 

आप अभी भी बाहर है कि समारोह को गति प्रदान करना चाहते हैं, आप एक सार्वजनिक विधि है कि अपनी रक्षा की विधि से चलाता घोषणा कर सकते हैं:

protected function b(){ 

} 

public function a(){ 
    $this->b() ; 
    //etc 
} 
2

आप जहाँ आप इस बनाने दूसरे के साथ इस वर्ग ओवरराइड कर सकते हैं जनता।

class cExample2 extends cExample { 
    public function funExample(){ 
    return parent::funExample() 
    } 
} 

(इस पर ध्यान दें निजी सदस्यों के साथ काम नहीं करेगा)

लेकिन निजी और संरक्षित सदस्यों का विचार है बाहर से नहीं कहा जा करने के लिए।

1

यदि आप अपनी कक्षाओं के बीच कोड साझा करना चाहते हैं तो आप लक्षणों का उपयोग कर सकते हैं, लेकिन यह इस बात पर निर्भर करता है कि आप अपने कार्य/विधि का उपयोग कैसे करना चाहते हैं।

वैसे भी

trait cTrait{ 
    public function myFunction() { 
     $this->funExample(); 
    } 
} 

class cExample{ 
    use cTrait; 

    protected function funExample() { 
    //functional code goes here 

    return $someVar 
    }//end of function 

}//end of class 

$object = new cExample(); 
$object->myFunction(); 

यह काम करते हैं, लेकिन ध्यान रखें कि आप नहीं जानते कि क्या अपने वर्ग इस तरह से बना है में रखना होगा। यदि आप विशेषता बदलते हैं तो आपके सभी वर्ग जो इसका उपयोग करते हैं उन्हें भी बदला जाएगा। आपके द्वारा उपयोग की जाने वाली प्रत्येक विशेषता के लिए इंटरफ़ेस लिखना भी अच्छा अभ्यास है।

1

यहाँ मैं तुम्हें एक उदाहरण

नीचे
<?php 
    class dog { 
     public $Name; 
     private function getName() { 
      return $this->Name; 
     } 
    } 

    class poodle extends dog { 
     public function bark() { 
      print "'Woof', says " . $this->getName(); 
     } 
    } 

    $poppy = new poodle; 
    $poppy->Name = "Poppy"; 
    $poppy->bark(); 
?> 

या एक दूसरे तरह से नवीनतम php

साथ उपयोग करने के लिए PHP में आप इस विचार का उपयोग कर सकते की तरह दे सकते हैं। सुरक्षित या निजी विधियों का आह्वान करने के लिए setAccessible() विधि http://php.net/reflectionmethod.setaccessible (बस इसे TRUE पर सेट करें)

19

तकनीकी रूप से, प्रतिबिंब API का उपयोग करके निजी और सुरक्षित विधियों का आह्वान करना संभव है। हालांकि, ऐसा करने का 99% समय वास्तव में एक बुरा विचार है। यदि आप कक्षा को संशोधित कर सकते हैं, तो सही समाधान संभवतः विधि को सार्वजनिक करने के लिए है। आखिरकार, यदि आपको कक्षा के बाहर इसे एक्सेस करने की ज़रूरत है, तो यह इसे संरक्षित करने के बिंदु को हरा देता है।

<?php 
class foo { 
    protected function bar($param){ 
     echo $param; 
    } 
} 

$r = new ReflectionMethod('foo', 'bar'); 
$r->setAccessible(true); 
$r->invoke(new foo(), "Hello World"); 
संबंधित मुद्दे