2011-11-26 10 views
13

में कक्षा मैं OOP PHP कोड है:प्राप्त माता पिता फैली php

class a { 
    // with properties and functions 
} 

class b extends a { 
    public function test() { 
     echo __CLASS__; // this is b 
     // parent::__CLASS__ // error 
    } 
} 

$b = new b(); 
$b->test(); 

मैं कुछ माता पिता वर्ग (सामान्य और अमूर्त) है और कई बच्चे कक्षाओं। बाल वर्ग माता-पिता वर्गों का विस्तार करते हैं। तो जब मैं किसी बिंदु पर बच्चे को तुरंत चालू करता हूं तो मुझे यह पता लगाना चाहिए कि मैंने कौन सा अभिभावक कहा था।

उदाहरण के लिए समारोह b::test() मेरी कक्षा ख से a

मैं कैसे (मेरे कोड से) प्राप्त कर सकते हैं वापस आ जाएगी वर्ग a?

धन्यवाद

+4

इस पढ़ें: http://stackoverflow.com/questions/506705/php-get-classname-from-static-call-in-extended-class –

उत्तर

16

आपके कोड ने सुझाव दिया है कि आपने parent का उपयोग किया है, जो वास्तव में आपको चाहिए। यह मुद्दा जादू __CLASS__ चर के साथ है।

documentation कहता है:

PHP 5 इस निरंतर रिटर्न वर्ग के नाम के रूप में यह घोषित किया गया था के रूप में।

कौन सा है कि हम क्या जरूरत है, लेकिन php.net पर this comment में बताया गया है:

क्लाड ने कहा कि __CLASS__ हमेशा कहते हैं कि इसमें कहा जाता है, यदि आप नहीं बल्कि वर्ग होता वर्ग में शामिल है कि इसके बजाय विधि get_class ($ यह) का उपयोग करें। हालांकि यह केवल उदाहरणों के साथ काम करता है, जब स्थिर रूप से नहीं कहा जाता है।

यदि आपको केवल मूल वर्ग की आवश्यकता है, तो इसके लिए एक समारोह भी है। यही कारण है कि एक get_parent_class

15

आप get_parent_class उपयोग कर सकते हैं:

class A {} 
class B extends A { 
    public function test() { 
    echo get_parent_class(); 
    } 
} 

$b = new B; 
$b->test(); // A 

यह भी अगर B::test स्थिर है काम करेंगे।

नोट: get_parent_class का प्रयोग तर्क के बिना $this को गुजरने के बिना तर्क के बिना एक छोटा सा अंतर है। अगर हम साथ ऊपर के उदाहरण का विस्तार:

class C extends B {} 

$c = new C; 
$c->test(); // A 

हम माता पिता वर्ग (बी की मूल वर्ग है, जहां विधि कहा जाता है) के रूप में A मिलता है। यदि आप ऑब्जेक्ट के लिए हमेशा निकटतम माता-पिता चाहते हैं तो आप इसके बजाय get_parent_class($this) का उपयोग करना चाहिए।

10

कहा जाता है वैसा करने के लिए प्रतिबिंब का उपयोग कर सकते हैं:

बजाय

parent::__CLASS__; 

उपयोग

$ref = new ReflectionClass($this); 
echo $ref->getParentClass()->getName(); 
11
class a { 
    // with propertie and functions 
} 

class b extends a { 

    public function test() { 
     echo get_parent_class($this); 
    } 
} 


$b = new b(); 
$b->test(); 
6

उपयोग class_parents बजाय। यह माता-पिता की एक सरणी देगा।

<?php 
class A {} 
class B extends A { 
} 
class C extends B { 
    public function test() { 
     echo implode(class_parents(__CLASS__),' -> '); 
    } 
} 

$c = new C; 
$c->test(); // B -> A 
संबंधित मुद्दे