2012-02-10 10 views
6

मेरे पास एक कक्षा है जो अन्य वर्ग के नामों के लिए कक्षा उपनाम स्थापित करती है। जब इस वर्ग के अंदर एलियस क्लास के माध्यम से एक फ़ंक्शन कहा जाता है, तो मुझे यह जानने की ज़रूरत है कि कौन से उपनाम का उपयोग किया गया था। PHP में ऐसा करने का कोई तरीका है?PHP में, class_alias का उपयोग करते समय आपको अलियोजित वर्ग कैसे मिलता है?

class foo 
{ 
    public static function test() 
    { 
    var_dump(get_called_class()); 
    } 
} 

class_alias('foo', 'bar'); 

foo::test(); 
bar::test(); 

कौन सा आउटपुट:

मैं निम्नलिखित कोड की कोशिश की है

string 'foo' (length=3) 
string 'foo' (length=3) 

लेकिन मैं उत्पादन string 'bar' (length=3) बजाय करने के लिए bar::test(); चाहते हैं। स्ट्रॉज़ पर ग्रासिंग, __CLASS__ और get_class() सभी एक ही परिणाम उत्पन्न करते हैं। मुझे PHP दस्तावेज़ में कुछ और नहीं मिल रहा है जो मुझे इस समस्या से मदद करेगा, लेकिन उम्मीद है कि मैं कुछ दिख रहा हूं।

class_alias का उपयोग करते समय आपको aliased कक्षा कहां मिलती है?

+5

मैं व्यक्तिगत रूप से कक्षा को अलियासिंग नहीं करने की सलाह देता हूं। यह केवल आँसू में खत्म होने जा रहा है। – GordonM

+0

आप तब तक नहीं कर सकते जब तक आप भयानक डीबग_बैकट्रैस() विधि का उपयोग नहीं करते ... बार :: test() बार वर्ग में परीक्षण() को कॉल नहीं कर रहा है, जो foo वर्ग का डुप्लिकेट या क्लोन है; यह foo क्लास में टेस्ट() को कॉल कर रहा है, जो कि बार के उपनाम भी होता है, इसलिए स्वाभाविक रूप से get_called_class() "foo" देता है। –

+0

डुबकी http://stackoverflow.com/questions/6245705/get-top-level-class-name-when-inheritance-and-class-alias-is-used – CBusBus

उत्तर

7

आप आसानी से PHP 5.3-5.5 के रूप में ऐसा नहीं कर सकते हैं।

कॉल करने के दौरान "वर्तमान" कक्षा क्या है, यह निर्धारित करने के लिए केवल कुछ ही तरीके हैं। वे सभी unaliased कक्षा वापस आते हैं।

class First { 
    public function test1() { echo get_called_class(); } 
    public function test2() { print_r(debug_backtrace()); } 
    public function test3() { echo get_class($this); } 
    public function test4() { echo __CLASS__; } 
    public static function test5() { echo get_called_class(); } 
} 
class_alias('First', 'Second'); 
$aliased = new Second(); 
$aliased->test1(); // First 
$aliased->test2(); // array(0 => array(... [object] => First Object, ...)) 
$aliased->test3(); // First 
$aliased->test4(); // First 
Second::test5(); // First 

3v4l demo

इसका कारण यह है class_alias नए नाम के साथ एक नई वर्ग पैदा नहीं करता है, यह है कि मूल रूप में एक ही कक्षा में बताते वर्गों की सूची में एक प्रविष्टि बना देता है। जब आप PHP को यह देखने के लिए कहते हैं कि किस वर्ग का उपयोग किया जा रहा है, तो यह मूल वर्ग पाता है, न कि उपनाम।

यदि आपको एक नई कक्षा बनाने की आवश्यकता है तो मूल वर्ग को एक अलग नाम के साथ और कुछ नहीं है, आपको विरासत के माध्यम से ऐसा करने की आवश्यकता होगी। आप इसे eval का उपयोग करके गतिशील रूप से कर सकते हैं। मुझे विश्वास नहीं है कि मैं कुछ के लिए eval की सिफारिश करने जा रहा हूं। Eww।

class First { 
    public function test1() { echo get_called_class(); } 
    public function test2() { print_r(debug_backtrace()); } 
    public function test3() { echo get_class($this); } 
    public function test4() { echo __CLASS__; } 
    public static function test5() { echo get_called_class(); } 
} 

function class_alias_kinda($original, $alias) { 
    eval("class $alias extends $original {}"); 
} 

class_alias_kinda('First', 'Second'); 
$aliased = new Second(); 
$aliased->test1(); // Second 
$aliased->test2(); // array(0 => array(... [object] => Second Object, ...)) 
$aliased->test3(); // Second 
$aliased->test4(); // First (this is expected) 
Second::test5(); // Second 

3v4l demo

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

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

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