2015-04-29 7 views
11

में सार्वजनिक, स्थैतिक फ़ंक्शन को कॉल करना मुझे लगता है कि यह प्रश्न भाषा-गीक्स की ओर अधिक है।एक अमूर्त वर्ग

<?php 
abstract class ScopeFactory 
{ 
    public static function doStuff() 
    { 

    } 
} 

अब, मैं तो की तरह, यह फ़ंक्शन को कॉल करने में सक्षम हूँ: मैं निम्नलिखित वर्ग है

ScopeFactory::doStuff()

और यह खुशी से काम करता है। मैंने हमेशा इस धारणा के तहत कोड किया है कि abstract कक्षाओं का सीधे उपयोग नहीं किया जा सका - और उन्हें कॉल करने योग्य होने के लिए एक ठोस वर्ग द्वारा कार्यान्वित किया जाना है।

static का मेरा प्रभाव यह है कि इसे कॉल करने योग्य होने के लिए इंस्टेंस की आवश्यकता नहीं है।

क्या कोई मुझे समझा सकता है कि यह कानूनी क्यों है, और यदि यह होना चाहिए? मैं बेहतर विवरण के बारे में उत्सुक हूँ।

+1

हां कक्षा की आवृत्ति (उदाहरण! = घोषणा) के समान स्थान पर एक स्थैतिक विधि संग्रहीत नहीं की जाती है। यह आपको सुराग देगा: http://stackoverflow.com/questions/17407203/can-we-use-static-method-in-an-abstract-class –

उत्तर

6

ओओपी में स्थिर तरीके आंतरिक स्थिति नहीं बदलती हैं, इसलिए आप एक अमूर्त वर्ग से स्थैतिक तरीकों को कॉल कर सकते हैं।

+0

मुझे जानने में दिलचस्पी है (निम्न स्तर पर) कैसे यह PHP रनटाइम में लागू किया गया है - कोई अंतर्दृष्टि? और * आंतरिक राज्य * से आपका मतलब है * अमूर्त वर्ग * की आंतरिक स्थिति *? – infomaniac

+0

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

4

मुझे आश्चर्य होगा अगर इसकी अनुमति नहीं दी जाएगी। सार वर्ग मानता है कि आप इसे तुरंत चालू नहीं कर सकते हैं। चूंकि स्थैतिक तरीकों को कक्षा के उदाहरण की आवश्यकता नहीं होती है, इसलिए आप खुशी से उनका उपयोग कर सकते हैं।

गहरी खोज रहे हैं, तो आप एक सार स्थिर विधि बनाने और इसे अपने गैर सार विधि से कह सकते हैं:

abstract class ScopeFactory 
{ 
    public static function doStuff() 
    { 
     static::otherStuff(); 
    } 

    abstract public static function otherStuff(); 
} 

पीएचपी आप एक गंभीर त्रुटि बताता है कि आपको एक सार विधि कॉल नहीं कर सकते हैं दे देंगे। लेकिन यह आपको एक E_STRICT चेतावनी देगा कि आपको अमूर्त स्थैतिक तरीकों को नहीं बनाना चाहिए।

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