PHP

2014-07-09 5 views
5

में कक्षा को तुरंत चालू करने का सही तरीका मैं कक्षा के अंदर एक विधि बनाने की कोशिश कर रहा हूं, जो वर्तमान में कक्षा में तुरंत चालू हो जाएगा। लेकिन मुझे इस विस्तार से सभी विस्तारित कक्षाओं में सही तरीके से काम करने की आवश्यकता होगी। जैसा कि मैंने this thread से सीखा है, इस कार्य के लिए self कीवर्ड का उपयोग करना अच्छा नहीं है। तो स्पष्ट विकल्प static कीवर्ड का उपयोग करेगा।PHP

लेकिन, मैं विभिन्न तरीकों से आया हूं जो काम भी करता है।

उदाहरण:

class SimpleClass 
{ 
    private $arg; 

    public function __construct($arg){ 
     $this->arg = $arg; 
    } 

    public function getArg(){return $this->arg;} 
    public function setArg($arg){$this->arg = $arg;} 

    public function staticInstance() 
    { 
     return new static($this->arg); 
    } 

    public function thisInstance() 
    { 
     return new $this($this->arg); 
    } 

    public function selfInstance() 
    { 
     return new self($this->arg); 
    } 
} 

class ExtendedClass extends SimpleClass 
{ 
} 

$c1 = 'SimpleClass'; 
$c2 = 'ExtendedClass'; 

$inst1 = new $c1('simple'); 
$inst2 = new $c2('extended'); 

$static_instance_1 = $inst1->staticInstance(); 
$this_instance_1 = $inst1->thisInstance(); 
$self_instance_1 = $inst1->selfInstance(); 

$static_instance_2 = $inst2->staticInstance(); 
$this_instance_2 = $inst2->thisInstance(); 
$self_instance_2 = $inst2->selfInstance(); 

echo "SimpleClass Instances\n"; 
echo get_class($static_instance_1); 
echo get_class($this_instance_1); 
echo get_class($self_instance_1); 

echo "ExtendedClass Instances\n"; 
echo get_class($static_instance_2); 
echo get_class($this_instance_2); 
echo get_class($self_instance_2); 

मैं इस उदाहरण से देख सकते हैं, दोनों staticInstance और thisInstance उत्पादन "सही" का परिणाम है। या वे करते हैं?

क्या कोई इन दो विधियों के बीच अंतर समझा सकता है और कौन सा "सही" है।

+1

सुनिश्चित नहीं हैं, लेकिन, जब तक कि आप का उपयोग 'new' कोई अंतर नहीं है। 'क्लोन' का उपयोग करते समय और उदाहरण में खुद को संग्रहीत करते समय यह दिलचस्प हो रहा है। – DanFromGermany

+0

स्थैतिक बनाम स्वयं का मेरा ज्ञान ऐसा है कि यदि एक विस्तारित वर्ग के किसी ऑब्जेक्ट उदाहरण से, तो आप एक विधि को कॉल करना चाहते थे जिसे विरासत में मिला था, उदाहरण के लिए, 'नया स्थिर ...' बनायेगा, यह एक विस्तारित वर्ग का नया उदाहरण। अगर उसने 'स्वयं' का उपयोग किया होता, तो यह माता-पिता का एक नया उदाहरण बना देगा (क्योंकि माता-पिता में विधि मौजूद है) – Alex

+0

स्थिर और स्वयं दुविधा के बारे में सबकुछ उस लिंक में समझाया गया है जिसे मैंने अपने प्रश्न के पहले पैराग्राफ में संदर्भित किया था। मेरी दुविधा $ और स्थिर के बीच है :) – AlFra

उत्तर

1

php.net का कहना है:

पीएचपी 5.3.0 के रूप में, पीएचपी एक विशेषता देर स्थिर बाइंडिंग जो स्थिर विरासत के संदर्भ में कहा जाता वर्ग संदर्भ के लिए इस्तेमाल किया जा सकता कहा जाता है लागू करता है।

अधिक सटीक, देर से स्थिर बाइंडिंग अंतिम "गैर-अग्रेषण कॉल" नामक कक्षा को संग्रहीत करके काम करते हैं। स्थैतिक विधि कॉल के मामले में, यह वर्ग स्पष्ट रूप से नामित है (आमतौर पर :: ऑपरेटर के बाईं ओर वाला एक); गैर स्थैतिक विधि कॉल के मामले में, यह वस्तु का वर्ग है। एक "अग्रेषण कॉल" एक स्थिर है जिसे स्वयं ::, मूल ::, स्थिर ::, या, श्रेणी पदानुक्रम में आगे बढ़ने पर, forward_static_call() द्वारा पेश किया जाता है। फ़ंक्शन get_called_class() को कॉल किए गए वर्ग और स्थिर :: के नाम से स्ट्रिंग पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है। इसका दायरा प्रस्तुत करता है।

इस सुविधा को दिमाग में एक आंतरिक परिप्रेक्ष्य के साथ "देर से स्थिर बाइंडिंग" नाम दिया गया था। "देर बाध्यकारी" इस तथ्य से आता है कि स्थैतिक :: उस वर्ग का उपयोग करके हल नहीं किया जाएगा जहां विधि परिभाषित की गई है लेकिन इसे रनटाइम जानकारी का उपयोग करके गणना की जाएगी। इसे "स्थैतिक बाध्यकारी" भी कहा जाता था क्योंकि इसका उपयोग स्थिर विधि कॉल के लिए (लेकिन इस तक सीमित नहीं है) के लिए किया जा सकता है। स्वयं :: या कक्षा की तरह मौजूदा वर्ग के लिए

स्टेटिक संदर्भ, वर्ग समारोह अंतर्गत आता है, जिसमें का उपयोग कर हल कर रहे हैं के रूप में जहां यह परिभाषित किया गया था:: स्वयं के

सीमाएं

<?php 
class A { 
    public static function who() { 
     echo __CLASS__; 
    } 
    public static function test() { 
     self::who(); 
    } 
} 

class B extends A { 
    public static function who() { 
     echo __CLASS__; 
    } 
} 

B::test(); 
?> 

ऊपर के उदाहरण होगा उत्पादन: A

लेट स्टेटिक बाइंडिंग 'उपयोग:

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

<?php 
class A { 
    public static function who() { 
     echo __CLASS__; 
    } 
    public static function test() { 
     static::who(); // Here comes Late Static Bindings 
    } 
} 

class B extends A { 
    public static function who() { 
     echo __CLASS__; 
    } 
} 

B::test(); 
?> 

ऊपर के उदाहरण होगा उत्पादन: B

$this कीवर्ड वर्तमान वस्तु को संदर्भित करता है और आप स्थिर तरीकों में इसका इस्तेमाल नहीं कर सकते हैं। जब आप return $this कहते हैं तो इसका अर्थ यह है कि कुछ विधि उसी वस्तु को वापस लाती है जिस पर इसे लागू किया गया था।

तो सही तरीका static कीवर्ड का उपयोग किया जाएगा, क्योंकि यदि आप कहते हैं कि return new static() यह वर्ग विधि में है को दर्शाता है।

+0

मुझे आपका जवाब पसंद है क्योंकि यह एक और समस्या का समाधान करता है जो मेरे पास जादू स्थिरांक के साथ है: डी – AlFra

+0

क्या कक्षा का नाम फिर से परिभाषित किए बिना कक्षा का नाम पाने का कोई तरीका है? (कक्षा बी में कोड की कोई अतिरिक्त लाइन नहीं) – AlFra

+0

आप इस उद्देश्य के लिए PHP प्रतिबिंब API का भी उपयोग कर सकते हैं। कुछ ऐसा: '$ reflB = नया प्रतिबिंब क्लास ('बी'); echo $ reflB-> नाम; 'तो आपको कक्षा का नाम मिलेगा –

संबंधित मुद्दे