2013-06-01 9 views
7

मैं एक PHP वर्ग है, जिसमें मैं कुछ तरीकों की दृश्यता को बदलने जनता के लिए संरक्षित से लिखने की कोशिश कर रहा हूँ। मेरा मानना ​​है कि मुझे याद है कि आप इसे सी ++ में कर सकते हैं, लेकिन मैंने कुछ खोज की हैं और मैं PHP में इसके लिए कुछ भी नहीं आ रहा हूं। क्या किसी को पता है कि यह PHP में भी संभव है?पीएचपी परिवर्तन विधि/समारोह दृश्यता

class ABC { 
    protected function foo() { 
      // Do something 
    } 
    } 

    class DEG extends ABC { 
     // can I make foo public now? 
    } 

उत्तर

11

आप जब इस तरह की एक आधार वर्ग से पाने के सदस्यों की दृश्यता बदल सकते:

class Base 
{ 
    protected function foo() {} 
} 

class Derived extends Base 
{ 
    public function foo() { return parent::foo(); } 
} 

आप गुण (के साथ एक ही भी कर सकते हैं एक protected संपत्ति को फिर से परिभाषित public के रूप में)।

हालांकि, ध्यान रखें कि यदि मूल संपत्ति private है तो आप वास्तव में इसकी पहुंच को नहीं बढ़ाएंगे बल्कि को उसी नाम के साथ घोषित करें। यह फ़ंक्शंस के साथ कोई समस्या नहीं है, जैसे कि आपने private बेस विधि को कॉल करने का प्रयास किया है, तो आपको तुरंत रनटाइम त्रुटि मिल जाएगी।

+0

हां, और यह वास्तव में सी ++ से अलग है (जहां आप व्युत्पन्न कक्षा में दृश्यता संशोधक 'ऊपरी' नहीं हो सकते हैं)। – raina77ow

+0

ठीक है, धन्यवाद! –

+0

क्या आप हमें दिखा सकते हैं कि किसी संपत्ति की दृश्यता को मूल में संरक्षित से व्युत्पन्न में कैसे बदला जाए? धन्यवाद! –

-1

हाँ, यह किया जा सकता है:

उदाहरण के लिए, इस वर्ग लगता है। PHP manual से हवाला देते हुए ..

एक संपत्ति या विधि की दृश्यता, कीवर्ड जनता के साथ घोषणा लगाकर द्वारा परिभाषित किया जा सकता संरक्षित या निजी। कक्षा सदस्यों ने घोषणा की कि जनता को हर जगह पहुंचा जा सकता है। सदस्य घोषित संरक्षित केवल वर्ग के भीतर ही और विरासत में मिला है और माता पिता के वर्गों द्वारा पहुँचा जा सकता है। सदस्यों को निजी रूप में घोषित किया गया सदस्य केवल हो सकता है जो सदस्य को परिभाषित करता है।

और वहाँ के रूप में अच्छी से उदाहरण ..

class MyClass 
{ 
    public $public = 'Public'; 
    protected $protected = 'Protected'; 
    private $private = 'Private'; 

    function printHello() 
    { 
     echo $this->public; 
     echo $this->protected; 
     echo $this->private; 
    } 
} 

$obj = new MyClass(); 
echo $obj->public; // Works 
echo $obj->protected; // Fatal Error 
echo $obj->private; // Fatal Error 
$obj->printHello(); // Shows Public, Protected and Private 

संपादित: हाँ, आप सार्वजनिक और संरक्षित सदस्यों की दृश्यता बदल सकते। पीएचपी पुस्तिका से एक और उदाहरण ..

/** 
* Define MyClass2 
*/ 
class MyClass2 extends MyClass 
{ 
    // We can redeclare the public and protected method, but not private 
    protected $protected = 'Protected2'; 

    function printHello() 
    { 
     echo $this->public; 
     echo $this->protected; 
     echo $this->private; 
    } 
} 

$obj2 = new MyClass2(); 
echo $obj2->public; // Works 
echo $obj2->private; // Undefined 
echo $obj2->protected; // Fatal Error 
$obj2->printHello(); // Shows Public, Protected2, Undefined 

?> 
+0

यह उदाहरण किसी भी वर्ग के सदस्यों की दृश्यता_ में परिवर्तन का प्रदर्शन नहीं करता है, यह केवल निजी, संरक्षित और सार्वजनिक दृश्यता के बीच _difference_ प्रदर्शित करता है। "आप सार्वजनिक और संरक्षित सदस्यों की दृश्यता बदल सकते हैं" - आप कक्षा सदस्यों की दृश्यता केवल _increase_ कर सकते हैं, इसलिए इस अर्थ में आप वास्तव में सार्वजनिक वर्ग की कक्षा सदस्य की दृश्यता को बदल नहीं सकते हैं। – MrWhite

3
  • आप व्युत्पन्न कक्षा में एक विधि को ओवरराइट कर सकते हैं ताकि इसकी दृश्यता (उदा। संरक्षित-> सार्वजनिक) हो। नए फ़ंक्शन को अपने माता-पिता को वापस कर दें।
  • आप यह है दृश्यता सीमित करने के ऐसा नहीं कर सकते (जैसे सार्वजनिक> संरक्षित), लेकिन आप एक विधि है कि फोन करने वाले के लिए पश्व-अनुरेखन जाँच करता है और एक अपवाद अगर यह एक विदेशी वर्ग thwors लागू कर सकते हैं।
  • तुम हमेशा reflection API का उपयोग दृश्यता में परिवर्तन के सभी प्रकार कर सकते हैं।
संबंधित मुद्दे