2012-05-08 13 views
8

अगर अब तक मैं थोड़ा सा समझ में आता हूं अब मुझे एहसास है कि मुझे कुछ भी समझ में नहीं आता है। मैं बहुत उलझन में हूं और मैं समझने के लिए संघर्ष करता हूं और मैं नहीं कर सकता। कोई व्यक्ति स्वयं, अभिभावक, स्थैतिक और का उपयोग करते समय इस कार्यक्रम को समझा सकता है, इसके बिना मैं सबसे छोटा परिवर्तन करता हूं जिसके परिणामस्वरूप मैं समझ नहीं पा रहा हूं कि क्या हो रहा है। बहुत बहुत शुक्रिया ..स्वयं, माता-पिता, स्थैतिक और कैसे उपयोग करते समय?

कोड http://docs.php.net/language.oop5.late-static-bindings से

<?php 
class A { 
    public static function foo() { 
     static::who(); 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

class B extends A { 
    public static function test() { 
     A::foo(); 
     parent::foo(); 
     self::foo(); 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 
class C extends B { 
    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

C::test(); 
?> 

बाहर डाल रहे हैं:

A 
C 
C 

उत्तर

17

आपको Late Static Binding की अवधारणा को समझने की आवश्यकता होगी, जो निर्धारित करता है जब एक पहचानकर्ता कोड/डेटा से जुड़ा होता है। आप PHP को इसे जल्दी से बांधने के लिए कह सकते हैं (self::) या बाद में (static::)।

स्लिमिंग उदाहरण दो वर्गों के लिए नीचे हम पाते हैं:

class A { 
    public static function foo() { 
     self::who(); // PHP binds this to A::who() right away 
     static::who(); // PHP waits to resolve this (hence, late)! 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

class B extends A { 
    public static function test() { 
     self::foo(); 
    } 

    public static function who() { 
     echo __CLASS__."\n"; 
    } 
} 

B::test(); 
+0

धन्यवाद और अधिक पढ़ें –

+1

अजीब! मैंने सोचा होगा कि देर से संस्करण डिफ़ॉल्ट होगा, यानी मेरा बच्चा वर्ग एक विधि को परिभाषित करने के लिए परेशान क्यों होगा और फिर डिफ़ॉल्ट रूप से मूल संस्करण को कॉल करेगा? लेकिन मुझे किसी भी अवसर को याद नहीं किया जा सकता है जिस पर PHP मानकों की अपेक्षा की गई थी। – jsh

+1

क्या कोई और बता सकता है। और 'स्थिर ::' बनाम 'स्वयं :: ' – Rafael

6

http://php.net/manual/en/language.oop5.static.php देखें। यह कहता है:

कक्षा गुणों या विधियों को घोषित करने से कक्षा के तत्काल आवश्यकता के बिना उन्हें सुलभ बना दिया जाता है।

...

क्योंकि स्थिर तरीकों बनाया वस्तु का एक उदाहरण के बिना प्रतिदेय हैं, छद्म चर $ यह नहीं उपलब्ध विधि स्थिर के रूप में घोषित अंदर है।

आप $this उपयोग नहीं कर सकते, क्योंकि जब एक स्थिर विधि बुला, वहाँ कोई instantiated वर्ग वस्तु $this चर में रखा जा रहा है। तो आप self:: का उपयोग करें।

parent:: वर्तमान वर्ग का विस्तार करने वाले मूल वर्ग का जिक्र कर रहा है। उदाहरण के लिए, कक्षा सी के लिए अभिभावक वर्ग कक्षा बी है, और कक्षा बी के लिए, मूल वर्ग कक्षा ए है http://php.net/manual/en/keyword.parent.php देखें।

आप स्थिर विधियों का उपयोग करते हैं जब आप वास्तव में उस वर्ग के उदाहरण के बिना फ़ंक्शन को सुलभ करना चाहते हैं।


आपके प्रश्न के करीब निरीक्षण के बाद, आपका लिंक लेट स्टेटिक बाइंडिंग को इंगित करता है। उस पृष्ठ में पहले दो उदाहरण बहुत स्पष्ट रूप से static:: वाक्य रचना के लिए जरूरत से संकेत मिलता है, लेकिन उदाहरण आप पोस्ट के लिए स्पष्ट करने के लिए:

क्लास ए में foo() विधि यह कहता है static::who() पर एक नजर डालें। इसका अर्थ यह है कि विधि who() को वर्ग के दायरे में बुलाया जाएगा जिसे फ़ंक्शन कहा जाता है, उस वर्ग के दायरे के बजाय जहां फ़ंक्शन परिभाषित किया गया है। इसलिए यदि आप C::foo() पर कॉल करना चाहते थे, तो यह सी

को प्रतिबिंबित करेगा यदि इसके बजाय, इसे self::who() कहा जाता है, तो यह A::who() पर कॉल करेगा। क्योंकि कक्षा ए के भीतर, self::

उम्मीद है कि मदद करता है।

+1

यह उत्तर स्पर्श नहीं करता है कि 'स्थिर ::' बनाम 'self ::' का उपयोग किया जाता है, जो वास्तव में उदाहरण कोड का सबसे महत्वपूर्ण पहलू है। – webbiedave

+0

@webbiedave: अच्छा बिंदु, संशोधित उत्तर। – Travesty3

+0

+1 मैंने इस बिंदु पर भी एक उत्तर पोस्ट किया लेकिन इससे पहले कि मैंने आपका संपादन देखा। – webbiedave

5

जवाब के लिए महत्वपूर्ण है स्थिर :: जो(), स्थिर याद :: मतलब है कि आप वास्तविक वर्ग के साथ विधि कॉल (हमारे मामले में - सी)।

तो सी :: परीक्षण() रन इस प्रकार है:

A::foo(); -> calls to A::foo() therefor echo A 
parent::foo(); -> calls to C parent (which is B), B::foo() inherits A::foo() which calls to static::who(), but our actual class is C, therefor echo C 
self::foo(); -> again calls to foo() which calls to static::who() with our actual class C 

अगर बजाय स्थिर :: जो() foo बुला रहा था स्वयं :: जो() आप तीन एक परिणाम के रूप में प्राप्त होगा।

+0

+1 दोनों के फायदे और नुकसान की व्याख्या करें धन्यवाद अच्छा स्पष्टीकरण – webbiedave

+0

समझाए जाने के लिए –