संपत्तियों बनाम वर्ग की निरंतरता


99

मैं बेहतर तरीके से समझना चाहूंगा कि नीचे के परिदृश्य में, वर्ग स्थिरांक बनाम उदाहरण चर के तरीके विरासत में प्राप्त होने के तरीके में अंतर है।

<?php
class ParentClass {
    const TEST = "ONE";
    protected $test = "ONE";

    public function showTest(){
        echo self::TEST;
        echo $this->test;
    }
}

class ChildClass extends ParentClass {
    const TEST = "TWO";
    protected $test = "TWO";

    public function myTest(){
        echo self::TEST;
        echo $this->test;
    }
}

$child = new ChildClass();
$child->myTest();
$child->showTest();

आउटपुट:

TWO
TWO
ONE
TWO

ऊपर दिए गए कोड में, चाइल्डक्लास के पास शोस्टेस्ट () विधि नहीं है, इसलिए पेरेंटक्लास शोस्टेस्ट () पद्धति का उपयोग वंशानुक्रम द्वारा किया जाता है। परिणाम दिखाते हैं कि चूंकि विधि पेरेंटक्लास पर निष्पादित हो रही है, इसलिए टेस्ट कंटेंट के पेरेंटक्लास संस्करण का मूल्यांकन किया जा रहा है, क्योंकि यह चाइल्डक्लास के संदर्भ में विरासत के माध्यम से मूल्यांकन कर रहा है, चाइल्डक्लास सदस्य चर $ परीक्षण का मूल्यांकन किया जा रहा है।

मैंने दस्तावेज़ीकरण पढ़ा है, लेकिन इस बारीकियों का कोई उल्लेख नहीं देख सकता। क्या कोई मेरे लिए कुछ रोशनी बहा सकता है?


WTF? लगातार ओवरराइडिंग !? यह मत करो! कभी नहीँ!
qwert_ukg

2
@qwert_ukg वास्तव में। किसी को PHP के डेवलपर्स के लिए संवाद करना चाहिए। या कम से कम अनुमति दें final...
ल्यूक Sawczak

1
लगातार ओवरराइडिंग के लिए भी निश्चित रूप से पर्याप्त उपयोग के मामले हैं:]
Arziel

जवाबों:


194

self::नहीं विरासत-अवगत है और हमेशा कक्षा में क्रियान्वित किया जा रहा है को दर्शाता है। आप php5.3 + आप कोशिश कर सकते हैं प्रयोग कर रहे हैं static::TESTके रूप में static::विरासत-वाकिफ हैं।

अंतर यह है कि static::"देर से स्थिर बंधन" का उपयोग करता है। अधिक जानकारी यहाँ प्राप्त करें:

http://php.net/manual/en/language.oop5.late-static-bindings.php

यहाँ एक सरल परीक्षण स्क्रिप्ट लिखी गई है:

<?php

class One
{
    const TEST = "test1";

    function test() { echo static::TEST; }
}
class Two extends One
{
    const TEST = "test2";
}

$c = new Two();

$c->test();

उत्पादन

test2

22
+ उल्लेख करने के लिए static::
जेसन मैकक्रेरी

बहुत बढ़िया। स्पष्टीकरण के लिए धन्यवाद और देर-स्थैतिक-बाइंडिंग पर अतिरिक्त जानकारी प्रदान करने के लिए (जो मुझे अभी तक पचाने के लिए है)।
टॉम ऑगर

3
चूंकि test()एक स्थिर विधि नहीं है, इसलिए $this::TESTPHP5.3 + के साथ उपयोग क्यों नहीं किया जाता है?
एक्सनोस

हाय @Xenos - उदाहरण का लक्ष्य यह दिखाना था कि कक्षा एक में निष्पादित कोड स्तर कक्षा दो से स्थिर मूल्यों को प्राप्त कर रहा था। स्व :: टेस्ट "टेस्ट 1" वापस आ जाता है जहां स्थिर :: टेस्ट अपेक्षित "टेस्ट 2" देता है - आशा है कि मदद करता है, उत्तर देने के लिए धन्यवाद!
डेविड फैरेल

हाय @DavidFarrell - हाँ, मुझे self::/ static::अंतर मिला है लेकिन मुझे नहीं लगता कि static::इसके बजाय $this::(नहीं self::) का उपयोग क्यों किया गया । वहाँ के बीच एक अंतर है $this::और static::(के बाद से वहाँ के बीच एक है static::/ $this::और self::)?
एक्सनोस

17

PHP में, स्वयं उस वर्ग को संदर्भित करता है जिसमें विधि या संपत्ति को परिभाषित किया जाता है। तो आपके मामले में आप कॉल कर रहे selfमें ChildClass, तो यह उस वर्ग से चर का उपयोग करता है। तब आप इसमें उपयोग करते selfहैं ParentClass, इसलिए यह उस वर्ग में चर का संदर्भ देता है।

यदि आप अभी भी चाहते हैं कि चाइल्ड क्लास constपेरेंट क्लास को ओवरराइड करे , तो अपने पैरेंट क्लास में निम्न कोड को इस पर एडजस्ट करें:

public function showTest(){
    echo static::TEST;
    echo $this->test;
}

staticकीवर्ड नोट करें । यह "लेट स्टैटिक बाइंडिंग" का उपयोग करता है। अब आप अभिभावक वर्ग को अपने बच्चे की कक्षा का हिस्सा कहेंगे।


समर्थक। स्थैतिक :: स्वयं के बजाय अमूर्तता में काम किया ::
Błajej Krzakala
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.