PHP में देर से स्थिर बाइंडिंग क्या हैं?




late-binding late-static-binding (5)

PHP 5.3.0 के रूप में, PHP देर से स्थैतिक बाध्यकारी नामक एक सुविधा लागू करता है जिसे स्थिर विरासत के संदर्भ में बुलाया वर्ग संदर्भित करने के लिए उपयोग किया जा सकता है।

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

चलिए एक उदाहरण देखें:

<?php
    class Car
    {
        public static function run()
        {
            return static::getName();
        }

        private static function getName()
        {
            return 'Car';
        }
    }

    class Toyota extends Car
    {
        public static function getName()
        {
            return 'Toyota';
        }
    }

    echo Car::run(); // Output: Car
    echo Toyota::run(); // Output: Toyota
?>

late static bindings अंतिम "गैर-अग्रेषण कॉल" नामक कक्षा को संग्रहित करके काम करती है। स्थैतिक विधि कॉल के मामले में, यह वर्ग स्पष्ट रूप से नामित है (आमतौर पर :: ऑपरेटर के बाईं ओर वाला एक); गैर स्थैतिक विधि कॉल के मामले में, यह वस्तु का वर्ग है।

एक "अग्रेषण कॉल" एक स्थिर है जिसे self:: , parent:: , static:: , या, श्रेणी पदानुक्रम में forward_static_call() , forward_static_call()

फ़ंक्शन get_called_class() को कॉल किए गए वर्ग और static:: के नाम से स्ट्रिंग पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है। इसका दायरा प्रस्तुत करता है।

PHP में देर से स्थिर बाइंडिंग क्या हैं?


अंतर दिखाने के लिए सबसे सरल उदाहरण।
नोट, स्वयं :: $ सी

class A
{
    static $c = 7;

    public static function getVal()
    {
        return self::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 7

देर स्थिर बाध्यकारी, नोट स्थिर :: $ सी

class A
{
    static $c = 7;

    public static function getVal()
    {
        return static::$c;
    }
}

class B extends A
{
    static $c = 8;
}

B::getVal(); // 8

इसे देखकर "मैं इसका उपयोग क्यों करूं?" परिप्रेक्ष्य, यह मूल रूप से उस संदर्भ को बदलने का एक तरीका है जिससे स्थैतिक विधि का अर्थ / चलाया जा रहा है।

self साथ, संदर्भ वह है जहां आपने मूल रूप से विधि को परिभाषित किया था। static साथ, यह वह है जिसे आप इसे बुला रहे हैं।


उदाहरण के लिए:

abstract class Builder {
    public static function build() {
        return new static;
    }
}

class Member extends Builder {
    public function who_am_i() {
         echo 'Member';
    }
}

Member::build()->who_am_i();

मैं पुस्तक से उद्धृत कर रहा हूं: "PHP मास्टर अत्याधुनिक कोड लिखते हैं"।

देर स्थिर बाध्यकारी php 5.3 के साथ पेश की गई एक विशेषता थी। यह हमें अभिभावक वर्ग से स्थैतिक तरीकों का वारिस करने और बाल वर्ग के संदर्भ में संदर्भित करने की अनुमति देता है।

इसका मतलब है कि आप स्थैतिक तरीकों के साथ एक अमूर्त वर्ग प्राप्त कर सकते हैं, और स्वयं :: विधि () के बजाय स्थिर :: विधि () नोटेशन का उपयोग करके बाल वर्ग के ठोस कार्यान्वयन का संदर्भ ले सकते हैं।

आधिकारिक PHP दस्तावेज़ों को भी देखने के लिए स्वतंत्र महसूस करें: http://php.net/manual/en/language.oop5.late-static-bindings.php

उदाहरण:

<?php
class Animal {
    public static function StaticCall() {
        // Parent object invokes its own getAnimalName()
        // Child object invokes its own getAnimalName() instead of parent's getAnimalName()
        return static::getAnimalName(); 
    }

    public static function SelfCall() {
        return self::getWeight();
    }

    private static function getAnimalName(){
        return 'Animal <br />';
    }

    private static function getWeight(){
        return '10 kg <br />';
    }
}

class Bird extends Animal  {
    public static function getAnimalName(){
        return 'Bird <br />';
    }

    private static function getWeight(){
        return '2 kg <br />';
    }
}

echo Animal::StaticCall(); // Animal       
echo Animal::SelfCall();   // 10 kg        
echo Bird::StaticCall();   // Bird    invokes method from own object
echo Bird::SelfCall();     // 10 kg   invokes method from parent

उपर्युक्त कोड में आप दो कक्षाएं देख सकते हैं Animal जो मूल वर्ग और Bird जो बाल वर्ग है। Animal और Bird दोनों को getWeight() और getWeight() विधि getWeight()StaticCall() Animal में दो विधियां हैं: StaticCall() और SelfCall()

विधि StaticCall() static कीवर्ड का उपयोग कर getAnimalName() को आमंत्रित करता है।
विधि SelfCall() self कीवर्ड का उपयोग कर SelfCall() आमंत्रित करती है।

अब हमारे पास सवाल यह है: किस संदर्भ में getAnimalName() निष्पादित किया गया है?

उत्तर: static::getAnimalName() संदर्भ की पहचान करता है और उस संदर्भ के भीतर विधि को आमंत्रित करता है।

यदि आप Bird::StaticCall() का आह्वान करते हैं तो कोड StaticCall() को निष्पादित करेगा जो कि Animal । फिर static::getAnimalName() विधि को प्राप्त करने के लिए विधि से निष्पादित और निष्पादित getAnimalName()

यह self:: से भिन्न होता है, क्योंकि self:: ऑब्जेक्ट self भीतर विधि को हमेशा आमंत्रित करता है। इसलिए यदि self::getWeight() को ऑब्जेक्ट में परिभाषित किया गया है तो विधि में Animal SelfCall() और Bird::SelfCall() होगा जिसे तब self::getWeight() कहा जाता है self::getWeight() getWeight() ऑब्जेक्ट के संदर्भ में self::getWeight() आमंत्रित करता है।





late-static-binding