PHP में स्थिर गुणों को अधिभारित करने की कोई सुविधा क्यों नहीं है?


13

पहचान

PHP आपको कक्षाओं में जादू के तरीकों की घोषणा करके विधि कॉल और संपत्ति एक्सेस को ओवरलोड करने की अनुमति देता है । यह कोड को सक्षम करता है जैसे:

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

ओवरलोडिंग इंस्टेंस प्रॉपर्टीज और तरीकों के अलावा, PHP 5.3.0 के बाद से हम staticमैजिक मेथड को ओवरराइड करके कॉल के तरीकों को भी ओवरलोड कर सकते हैं __callStatic

कुछ छूट रहा है

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

echo Foo::$missingProperty; // fatal error: access to undeclared static property

यह सीमा स्पष्ट रूप से प्रलेखित है :

संपत्ति अधिभार केवल वस्तु संदर्भ में काम करता है। इन जादू विधियों को स्थिर संदर्भ में ट्रिगर नहीं किया जाएगा। इसलिए इन तरीकों को घोषित नहीं किया जाना चाहिए static। PHP 5.3.0 के अनुसार, मैजिक ओवरलोडिंग विधियों में से एक घोषित होने पर चेतावनी जारी की जाती है static

लेकिन क्यों?

मेरे प्रश्न हैं:

  1. क्या कोई तकनीकी कारण है कि यह कार्यक्षमता वर्तमान में समर्थित नहीं है? या शायद (एक कंपकंपी) राजनीतिक कारण?
  2. क्या अतीत में इस कार्यक्षमता को जोड़ने के लिए कोई निरर्थक प्रयास हुए हैं?

सबसे महत्वपूर्ण बात, सवाल यह नहीं है कि "उपयोगकर्तालैंड PHP में गतिशील स्थिर गुण कैसे हो सकते हैं?"। उस ने कहा, यदि आप एक विशेष रूप से प्यारा कार्यान्वयन के बारे में जानते हैं, जिसके आधार पर __callStaticआप साझा करना चाहते हैं तो हर तरह से ऐसा करें।

जवाबों:


11

उद्धरण http://marc.info/?l=php-internals&m=121578194822276ww=2

क्या स्थैतिक सदस्य ओवरलोडिंग PHP 5.3 में जोड़ा गया था? मैंने देखा कि स्थैतिक विधि अधिभार (__callStatic) थी। दोनों एक दूसरे के पूरक होंगे और इनको जोड़ना भी स्वाभाविक लगता है। मैंने नोटिस किया कि वे "स्टैटिक-क्लास" RFC और बग रिपोर्ट के अलावा हैं, लेकिन 5.3 में ये देखना अच्छा होगा। इस जोड़ और एलएसबी के साथ, php कक्षाएं इतना कुछ कर सकती हैं! उदाहरण के लिए:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

अनुवर्ती http://marc.info/?l=php-internals&m=121578318524848&w=2

यदि स्थिर वर्गों के लिए RFC स्वीकार कर लिया जाएगा, तो स्थैतिक संपत्ति इंटरसेप्टर अगले PHP प्रमुख संस्करण का एक हिस्सा होगा (यह 5.4 या 6 हो सकता है)। इसलिए यह 5.3 में नहीं बनेगा, लेकिन भविष्य में हमें उम्मीद है कि यह होगा।

स्थैतिक वर्गों के लिए लिंक RFC:

RFC की स्थिति "काम करता है" में दी गई है, लेकिन यह 2008 से है कि आप php.internals मेलिंग सूची या # php.pecl पर EFNet IRC पर पूछना चाहते हैं कि यह क्या हो गया है।


धन्यवाद, गॉर्डन, हमेशा की तरह, बहुत उपयोगी। ;-) स्टेटिक क्लासेस आरएफसी के लिए समर्थन का प्रस्ताव करने लगता है __getStatic()और __setStatic()पर स्थिर कक्षाएं, यह अभी भी instantiable कक्षाओं के लिए इस कार्यक्षमता के लिए उपयोगी होगा। क्या आप इस दिशा में किसी कदम से अवगत हैं?
डेविड वेन्रब

@DavidWeinraub नहीं, क्षमा करें। Tbh, मैं स्थैतिक तरीकों से संबंधित चीजों की परवाह नहीं करता। मुझे उनके लिए कोई अच्छा उपयोग कभी नहीं मिला और वे खराब युग्मन और दर्दनाक परीक्षण का नेतृत्व करते हैं।
गॉर्डन

बिलकुल सहमत! ;-) लेकिन कुछ चौखटे जो मुझ पर जोर डाल रहे हैं, उनके मॉडल परत के लिए स्टैटिक्स का उपयोग करते हैं। __getStatic()मुझे अपने मौजूदा कोड का एक बहुत ऊपर DRY करने में सक्षम करेगा। धन्यवाद!
डेविड वेन्रब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.