2009-07-20 19 views
29

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

class myClass{ 
    function test1() 
    { 
     if(method_exists("myClass", "test1")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test2() 
    { 
     if(method_exists($this, "test2")) 
     { 
      echo "Hi"; 
     } 
    } 
    function test3() 
    { 
     if(method_exists(self, "test3")) 
     { 
      echo "Hi"; 
     } 
    } 
} 
// Echos Hi 
myClass::test1(); 
// Trys to use 'self' as a string instead of a constant 
myClass::test3(); 
// Echos Hi 
$obj = new myClass; 
$obj->test2(); 

मैं इसे स्थिर संदर्भ से बाहर ले जाने की जरूरत के बिना परीक्षण 3 गूंज बनाने के लिए हाय समारोह मौजूद रहने पर, सक्षम होना चाहिए: यहाँ एक बेहतर उदाहरण है। वर्ग को एक्सेस करने के लिए कीवर्ड को देखते हुए 'स्वयं' होना चाहिए, क्योंकि $ यह असाइन किए गए वर्गों के लिए है।

+0

test1() विधि पर्याप्त क्यों नहीं है? – gapple

+0

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

उत्तर

49

get_called_class() पीएचपी 5.3 में पेश किया गया था, और "लेट स्टेटिक बाइंडिंग" वर्ग के नाम वापस आ जाएगी:

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_called_class(), "test")) 
     { 
       echo get_called_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // should print "subClass::test()" 

get_class() समारोह, php 5.0.0 के रूप में की आवश्यकता नहीं है जो किसी वर्ग के भीतर बुलाए जाने वाले किसी भी पैरामीटर को उस वर्ग का नाम वापस कर दिया जाएगा जिसमें फ़ंक्शन घोषित किया गया था (उदाहरण के लिए, अभिभावक वर्ग):

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_class(), "test")) 
     { 
       echo get_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 

__CLASS__ magic constant वही [link] करता है।

class myClass{ 
    public static function test() 
    { 
     if(method_exists(__CLASS__, "test")) 
     { 
       echo __CLASS__.'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

subClass::test() // prints "myClass::test()" 
+0

धन्यवाद! मुझे इसी की तो तलाश थी। –

+0

मैं यह जांचने का एक तरीका ढूंढ रहा था कि क्या मूल वर्ग पर एक स्थिर विधि मौजूद है, और इस जवाब ने मुझे यह पता लगाने के लिए प्रेरित किया कि 'get_parent_class()' किसी भी पैरा के बिना कॉल किए जाने पर उसी तरह काम करता है। धन्यवाद! – mopo922

1

अद्यतन:

आह, क्षमा करें। मैं अस्थायी रूप से अंधा था :) आप जादू निरंतर __CLASS__

उदा।

if (method_exists(__CLASS__, "test3")) { echo "Hi"; } 
+0

यह उत्तर स्ट्रिंग – gapple

+0

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

+0

क्या आप उन टिप्पणियों से हैं जिन्हें मैंने मुख्य प्रश्न पर रखा है? –

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