2010-08-13 10 views
13

में स्थिर मेटोड्स मुझे लगता है कि कोई अंतर नहीं हो सकता है लेकिन निजी प्राथमिकता है, लेकिन विभिन्न PHP कोड पढ़ने पर मैं विधियों वर्ग तक पहुंचने के दोनों तरीकों से आती हूं।स्वयं :: बनाम कक्षा नाम :: स्थिर वर्ग के अंदर PHP

class Myclass 
{ 
    public static $foo; 

    public static function myMethod() 
    { 
     // between: 
     self::$foo; 
     // and 
     MyClass::$foo; 
    } 
} 
+0

खेद है कि मैं एक गलत जवाब के लिए पहली बार दिया । अद्यतन उत्तर देखें। – Artefacto

उत्तर

30

:

क्या अंतर है (नोट: प्रारंभिक संस्करण कहा कोई अंतर नहीं था असल में वहाँ है।)

वास्तव में एक छोटे से diference नहीं है। self:: आगे स्थिर कॉल, जबकि className:: नहीं है। PHP 5.3+ में यह केवल late static bindings के लिए महत्वपूर्ण है।

स्थिर कॉल में, PHP 5.3+ प्रारंभिक रूप से कॉल की गई कक्षा को याद करता है। className:: का उपयोग करके PHP इस मान को भूल जाता है (यानी, इसे className पर रीसेट करता है), जबकि self:: इसे संरक्षित करता है। पर विचार करें:

<?php 
class A { 
    static function foo() { 
     echo get_called_class(); 
    } 
} 
class B extends A { 
    static function bar() { 
     self::foo(); 
    } 
    static function baz() { 
     B::foo(); 
    } 
} 
class C extends B {} 

C::bar(); //C 
C::baz(); //B 
+1

बहुत महत्वपूर्ण जानकारी, धन्यवाद। – raveren

+0

महत्वपूर्ण सुधार/जोड़: इस उद्देश्य के लिए 'स्थिर 'कीवर्ड पेश किया गया था। प्रत्येक ए, बी और सी के लिए 'कॉन्स फूड = __ क्लास __;' जोड़ें, और 'ए :: फू()' दोनों 'स्वयं :: खाद्य' और 'स्थिर :: खाद्य 'प्रिंट करें। केवल उत्तरार्द्ध वास्तव में 'सी :: बाज़()' के लिए सही होगा। – janmoesen

+0

@Atetefacto जो आप एक सामान्य अनुप्रयोग के लिए सिफारिश करेंगे जो देर से स्थिर बाइंडिंग का उपयोग नहीं करता है? क्या आप 'self ::' या 'MyClass ::' चुनते हैं? आपने सुझाव दिया कि आपने अधिक कुशलता से प्रदर्शन किया? धन्यवाद –

1

स्वयं के साथ आप, वर्ग के भीतर और "MyClass" के साथ उपयोग कर सकते हैं आप के रूप में, आप इसे बाहर से देख सकते हैं:

$instance = new Myclass(); 
$variable = $instance::$foo 
संबंधित मुद्दे