php स्थिर कार्य


108

मेरे पास php में स्टेटिक फंक्शन के बारे में एक सवाल है।

चलो मान लेते हैं कि मेरे पास एक वर्ग है

class test {
    public function sayHi() {
        echo 'hi';
    }
}

अगर मैं test::sayHi();यह एक समस्या के बिना काम करता है।

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); साथ ही काम करता है।

प्रथम श्रेणी और द्वितीय श्रेणी के बीच अंतर क्या हैं?

एक स्थिर कार्य के बारे में क्या खास है?


15
Php7 के अनुसार आप गैर-स्थिर विधि को संवैधानिक रूप से नहीं कह सकते
sanjay yadav

जवाबों:


153

प्रथम श्रेणी में, sayHi()वास्तव में एक उदाहरण विधि है जिसे आप एक स्थिर विधि के रूप में बुला रहे हैं और आप इसके साथ दूर हो जाते हैं क्योंकि यह sayHi()कभी भी संदर्भित नहीं होता है $this

स्टैटिक फ़ंक्शंस क्लास के साथ जुड़े होते हैं, क्लास का उदाहरण नहीं। जैसे, $thisएक स्थिर संदर्भ से उपलब्ध नहीं है ( $thisकिसी भी वस्तु की ओर इशारा नहीं करता है)।


22
अब गैर-स्टैटिक विधियों की स्टैटिक कॉलिंग काम करती है, लेकिन इसे हटा दिया जाता है। उदाहरण के तरीकों के लिए इस सिंटैक्स का उपयोग करके सावधान रहें!
जेट

1
तो इसीलिए वे इसे स्थिर कार्य कहते हैं? क्योंकि डायनेमिक डेटा प्रवाह और डायनेमिक आउटपुट के साथ कोई एक से अधिक इंस्टेंस नहीं है। बस मेरा मार्गदर्शन करें। @ अराजकता
सूरज

22

बस, स्थिर कार्य उस वर्ग से स्वतंत्र रूप से कार्य करते हैं जहां वे हैं।

$ इसका मतलब है, यह इस वर्ग का एक उद्देश्य है। यह स्थैतिक कार्यों पर लागू नहीं होता है।

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'

9
ठीक है, मैं एक PHP जादूगर नहीं हूं, लेकिन वह चर ('हैलो') नहीं है जो स्थिर फ़ंक्शन को दिया गया है, स्पष्ट रूप से 'हाय' के साथ ओवरराइट किया जा रहा है? मतलब कि लाइन प्रिंट टेस्ट 1 :: sayHi ('हैलो'); 'हैलो' नहीं लौटाएगा, लेकिन 'हाय' लौटाएगा?
Fnord23

6
यह उत्तर मैला है (स्थैतिक कार्यों का प्रभाव इस बात पर निर्भर कर सकता है कि वे किस वर्ग में हैं) और उदाहरण बिंदु को बहुत स्पष्ट नहीं करते हैं।
रीइनस्टीरपोस्ट 22

बहुत अच्छा उदाहरण नहीं है। $ हाय = 'हाय'; दिए गए तर्क को ओवरराइट करता है, और स्थैतिक घोषणा से कोई लेना-देना नहीं है। मैं इसे ठीक करूंगा: स्व :: $ हाय = $ हाय; और यह गैर-स्थिर की तरह ही काम करेगा। आप स्वयं के साथ वर्ग चर का उपयोग कर सकते हैं :: $ के
बजाय-

20

संपूर्ण अंतर यह है कि, आपको $thisस्टैटिक फ़ंक्शन के अंदर आपूर्ति नहीं मिलती है। यदि आप उपयोग करने का प्रयास करते हैं $this, तो आपको मिल जाएगा Fatal error: Using $this when not in object context

ठीक है, ठीक है, एक अन्य अंतर: एक E_STRICTचेतावनी आपके पहले उदाहरण से उत्पन्न होती है।


1
जब मैं पहली बार उपयोग करता हूं तो मुझे कोई चेतावनी नहीं होती है और मैं php7 में उपयोग करता हूं
ashkan nasirzadeh

हमारे पास स्थैतिक कार्य के अंदर यह $ क्यों नहीं है? इसका वास्तु तर्क क्या है? धन्यवाद।
लुकास बस्टामेंट

@LucasBustamante: $thisवर्तमान वस्तु को संदर्भित करता है। एक स्थिर फ़ंक्शन में, कोई वर्तमान ऑब्जेक्ट नहीं है; फ़ंक्शन उस वर्ग के ऑब्जेक्ट उदाहरण के लिए आवश्यकता या संदर्भ के बिना वर्ग पर मौजूद है।
अराजकता

3

गैर-स्थिर तरीकों को कॉल करना सांख्यिकीय रूप से E_STRICT स्तर की चेतावनी उत्पन्न करता है।


2

संक्षेप में, आपके पास दूसरे मामले में $ के रूप में वस्तु नहीं है, क्योंकि स्थैतिक विधि कक्षा का एक फ़ंक्शन / विधि है न कि वस्तु उदाहरण।


1
स्थिर है बस कैसे आप वर्ग कार्यों को परिभाषित? कोई अन्य फैंसी व्यवसाय? तो आप कह रहे हैं कि अगर इसे "स्थिर" के बजाय "class_method" कहा जाता था, तो यह अधिक अर्थपूर्ण होगा?
एहनबीकैड

1

उदाहरणों (PHP 5.3.5) की कोशिश करने के बाद, मैंने पाया कि फ़ंक्शंस को परिभाषित करने के दोनों मामलों में आप $thisक्लास फ़ंक्शंस पर काम करने के लिए ऑपरेटर का उपयोग नहीं कर सकते हैं । इसलिए मुझे उनमें अभी तक कोई अंतर नहीं मिला। :(

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.