Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> PHP

PHP लेट स्टैटिक बाइंडिंग (Late Static Bindings) - static:: बनाम self::


परिचय

PHP में लेट स्टैटिक बाइंडिंग की यह सुविधा स्टैटिक इनहेरिटेंस में कॉल की गई क्लास को संदर्भित करने के लिए उपयोग की जाती है। जब स्टैटिक मेथड्स को कॉल किया जाता है, तो क्लास का नाम स्कोप रिज़ॉल्यूशन ऑपरेटर (::) के साथ जुड़ा होता है जबकि अन्य इंस्टेंस मेथड्स के मामले में हम उन्हें ऑब्जेक्ट के नाम का उपयोग करके कॉल करते हैं। static:: को उस क्लास का उपयोग करके हल नहीं किया जाएगा जिसमें मेथड परिभाषित है, बल्कि रनटाइम जानकारी का उपयोग करके गणना की जाएगी। वर्तमान क्लास के स्टैटिक संदर्भों को उस क्लास का उपयोग करके हल किया जाता है जिसमें फ़ंक्शन संबंधित है, न कि जहां इसे परिभाषित किया गया था।

उदाहरण

उदाहरण 1: self:: के साथ समस्या

निम्न कोड में, पैरेंट क्लास self:: प्रीफिक्स के साथ स्टैटिक मेथड कॉल करती है। वही मेथड जब चाइल्ड क्लास के साथ कॉल की जाती है तो चाइल्ड क्लास के नाम को संदर्भित नहीं करती क्योंकि यह हल नहीं होती।

<?php 
class test1 { 
    public static $name = "Raja"; 
    public static function name() { 
        echo "name of class: " . __CLASS__; 
    } 
    public static function getname() { 
        self::name(); 
    } 
} 
class test2 extends test1 { 
    public static function name() { 
        echo "name of class: " . __CLASS__; 
    } 
} 
test2::getname(); 
?>

आउटपुट

name of class: test1

परिणाम दिखाता है कि अपेक्षा के विपरीत, पैरेंट क्लास का नाम लौटाया जाता है।

उदाहरण 2: static:: के साथ लेट बाइंडिंग

self:: के बजाय static:: का उपयोग रनटाइम पर लेट बाइंडिंग बनाता है:

<?php 
class test1 { 
    public static function name() { 
        echo "name of class: " . __CLASS__; 
    } 
    public static function getname() { 
        static::name(); 
    } 
} 
class test2 extends test1 { 
    public static function name() { 
        echo "name of class: " . __CLASS__; 
    } 
} 
test2::getname(); 
?>

आउटपुट

name of class: test2

उपरोक्त कोड अब अपेक्षा के अनुरूप चाइल्ड क्लास का नाम लौटाता है।

उदाहरण 3: नॉन-स्टैटिक संदर्भ में static:: का उपयोग

पैरेंट में प्राइवेट मेथड चाइल्ड में कॉपी हो जाता है, इसलिए इसका स्कोप अभी भी पैरेंट होगा।

<?php 
class test1 { 
    private function name() { 
        echo "name of class: " . __CLASS__ . "\n"; 
    } 
    public function getname() { 
        $this->name(); 
        static::name(); 
    } 
} 
class test2 extends test1 { 
    // 
} 
$t2 = new test2(); 
$t2->getname(); 
?>

आउटपुट

name of class: test1 
name of class: test1

उदाहरण 4: पैरेंट मेथड ओवरराइड होने पर

हालांकि, जब पैरेंट मेथड ओवरराइड होता है, तो इसका स्कोप बदल जाता है।

class test3 extends test1 { 
    private function name() { 
        /* मूल मेथड रिप्लेस हो गया; name का स्कोप test3 है */ 
    } 
} 
$t3 = new test3(); 
$t3->name();

आउटपुट

PHP Fatal error: Uncaught Error: Call to private method test3::name() from context ''
  1. - PHP में final कीवर्ड

    PHP में final कीवर्ड PHP में **final** कीवर्ड **मेथड्स** और **क्लासेस** के लिए उपयोग किया जाता है: मेथड्स के लिए: मेथड **ओवरराइडिंग रोकता है**। क्लासेस के लिए: **विरासत (इनहेरिटेंस) रोकता है**। उदाहरण 1: फाइनल मेथड demo(); // डेराइव्ड क्लास फ़ंक्शन! ?> आउटपुट डेराइव्ड क्लास फ़ंक्शन! उदाह

  1. - PHP में इंटरफेस समझाया गया

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

  1. - PHP में एब्स्ट्रैक्ट क्लास समझाया गया

    PHP5 अपने साथ ऑब्जेक्ट-ओरिएंटेड मॉडल लाता है, ऑब्जेक्ट-ओरिएंटेड मॉडल की कुछ अवधारणाएं हैं: क्लास, ऑब्जेक्ट, एनकैप्सुलेशन, पॉलीमॉर्फिज्म, एब्स्ट्रैक्ट और फाइनल क्लासेज, और मेथड्स, इंटरफेसेस और इनहेरिटेंस, आदि... इस लेख में, हम एब्स्ट्रैक्ट क्लास और PHP में ऑब्जेक्ट-ओरिएंटेड तकनीकों से संबंधित इसकी व