जवाबों:
क्या मुझे वही परिणाम मिलेंगे?
ज़रुरी नहीं। मुझे PHP 5.2 के लिए वर्कअराउंड का पता नहीं है, हालाँकि।
बीच क्या अंतर है
new self
औरnew static
?
self
उसी वर्ग को संदर्भित करता है जिसमें new
कीवर्ड वास्तव में लिखा गया है।
static
PHP 5.3 के देर से स्थैतिक बाइंडिंग में, पदानुक्रम में जो भी वर्ग आप पर विधि कहा जाता है को संदर्भित करता है।
निम्नलिखित उदाहरण में, B
दोनों विधियों से विरासत में मिला है A
। self
मंगलाचरण के लिए बाध्य है A
, क्योंकि यह में परिभाषित किया गया है A
पहली विधि के के कार्यान्वयन, जबकि static
कहा जाता वर्ग के लिए बाध्य है (यह भी देखें get_called_class()
)।
class A {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class B extends A {}
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
get_called_class()
, जो प्रभावी रूप से समान है __CLASS__
, लेकिन एलएसबी संगत है।
self
खुद ही लौट आएंगे, और static
कुछ ऐसा लौटाएंगे जिसे ओवरराइड नहीं किया जा सकता ... लेकिन लो और निहारना इसके विपरीत है। मैं PHP के नामकरण, सम्मेलनों और समग्र शैली से प्रभावित होना कभी नहीं चाहता। -_-
यदि इस कोड की विधि स्थिर नहीं है, तो आप 5.2 का उपयोग करके काम के आसपास प्राप्त कर सकते हैं get_class($this)
।
class A {
public function create1() {
$class = get_class($this);
return new $class();
}
public function create2() {
return new static();
}
}
class B extends A {
}
$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));
परिणाम:
string(1) "B"
string(1) "B"
clone
, लेकिन बस गुणों को फिर से बनाने और सेट करने से। $copy = new static(); $copy->set($this->get()); return $copy;
self::
या नहीं, आपकी पसंद static::
प्रभावित करने वाली है। किसी कारण के अभाव में ऐसा है कि एक स्थिति स्वाभाविक रूप से होने वाली बुरा व्यवहार को इंगित करता है सोचने के लिए (और मैं किसी भी कारण नहीं दिख रहा है यह क्यों इतना होना चाहिए), के बीच विकल्प self::
और static::
गैर स्थिर तरीकों के भीतर बस के रूप में प्रासंगिक के रूप में यह में है स्थैतिक तरीके। क्या मैंने आपकी टिप्पणी को गलत समझा है, या हममें से कोई एक गलत है?
दूसरों के जवाब के अलावा:
स्टेटिक :: रनटाइम जानकारी का उपयोग करके गणना की जाएगी।
इसका मतलब है कि आप static::
एक वर्ग संपत्ति में उपयोग नहीं कर सकते क्योंकि गुण मान:
संकलन समय पर मूल्यांकन करने में सक्षम होना चाहिए और रन-टाइम जानकारी पर निर्भर नहीं होना चाहिए।
class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Fatal error
का उपयोग करते हुए self::
class Foo {
public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo
कृपया ध्यान दें कि मेरे द्वारा बनाए गए कोड में घातक त्रुटि टिप्पणी यह नहीं दर्शाती है कि त्रुटि कहां हुई है, त्रुटि पहले हुई थी क्योंकि वस्तु को तुरंत हटा दिया गया था क्योंकि @Grapestain टिप्पणियों में उल्लिखित है
public $name = static::class;
, रेखा 7 पर नहीं, जैसा कि उदाहरण द्वारा सुझाया गया है। त्रुटि कहती है: "स्थिर :: वर्ग का उपयोग संकलन-समय वर्ग के नाम समाधान के लिए नहीं किया जा सकता है" जो इंगित करता है कि समस्या वह नहीं है जहां आप $ नाम फ़ील्ड तक पहुंचने का प्रयास करते हैं, लेकिन इससे पहले, PHP वर्ग के संकलन पर। लाइन 7 (या 6) पहले उदाहरण में नहीं पहुंचेगी।