फ़ंक्शन के अंदर `स्थिर` कीवर्ड?


110

मैं ड्रुपल 7 के लिए स्रोत देख रहा था, और मुझे कुछ चीजें मिलीं जो मैंने पहले नहीं देखी थीं। मैंने कुछ प्रारंभिक खोज php मैनुअल में की, लेकिन इसने इन उदाहरणों की व्याख्या नहीं की।

staticएक फंक्शन के अंदर एक वैरिएबल पर कीवर्ड क्या करता है ?

function module_load_all($bootstrap = FALSE) {
    static $has_run = FALSE

जवाबों:


155

यह फ़ंक्शन को दिए गए चर का मान याद रखता है ($has_run को कई कॉल के बीच आपके उदाहरण में) ।

आप इसका उपयोग विभिन्न उद्देश्यों के लिए कर सकते हैं, उदाहरण के लिए:

function doStuff() {
  static $cache = null;

  if ($cache === null) {
     $cache = '%heavy database stuff or something%';
  }

  // code using $cache
}

इस उदाहरण में, ifकेवल एक बार निष्पादित किया जाएगा। भले ही कई कॉल doStuffहो।


4
इसके अलावा, अगर समारोह एक बार चलने के बाद, इसके बारे में मूल्य रीसेट नहीं होगा $cacheकरने के लिए nullबाद में कॉल पर, है ना?
user151841

7
@ user151841 $cacheकेवल अनुरोधों के बीच रीसेट किया जाएगा। तो हां, यह उसी अनुरोध (या स्क्रिप्ट के निष्पादन) में लेटर्स कॉल पर रीसेट नहीं किया जाएगा ।
योशी

14
@ मौहम्मद क्योंकि यह वही है जो खोजशब्द स्थैतिक करता है।
योशी

2
मेरा मानना ​​है कि हर बार जब इस फ़ंक्शन को कॉल किया जाता है तो ifकंडीशन चेक $cache === nullनिष्पादित किया जाएगा, सोचा नहीं कि क्या ब्लॉक कोड $cache = '..'निष्पादित किया जाएगा।
ऐवारस

यदि फ़ंक्शन किसी वर्ग में एक विधि है, तो स्थैतिक चर को उदाहरणों के बीच साझा किया जाता है?
1964 में santiago arizti

83

ऐसा लगता है कि किसी ने भी अब तक उल्लेख नहीं किया है, एक ही वर्ग के विभिन्न उदाहरणों के अंदर स्थिर चर उनके राज्य बने हुए हैं। इसलिए OOP कोड लिखते समय सावधान रहें।

इस पर विचार करो:

class Foo
{
    public function call()
    {
        static $test = 0;

        $test++;
        echo $test . PHP_EOL; 
    }
}

$a = new Foo();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Foo();
$b->call(); // 4
$b->call(); // 5

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

class Bar
{
    private $test = 0;

    public function call()
    {
        $this->test++;
        echo $this->test . PHP_EOL; 
    }
}


$a = new Bar();
$a->call(); // 1
$a->call(); // 2
$a->call(); // 3


$b = new Bar();
$b->call(); // 1
$b->call(); // 2

1
आउच! इसने मुझे एक से अधिक बार काटा है। मुझे उम्मीद थी कि स्थैतिक केवल उदाहरण पर लागू होगा, संस्मरण प्रदान करेगा; लेकिन यह सोचने का तरीका गलत था, क्योंकि कक्षाओं के संदर्भ में "स्थिर" का अर्थ है समग्र रूप से वर्ग के लिए। गुण, विधियाँ, और चर।
सिस्टमोविच

14

निम्नलिखित उदाहरण दिया:

function a($s){
    static $v = 10;
    echo $v;
    $v = $s;
}

की पहली कॉल

a(20);

उत्पादन होगा 10, तो $vहोना है 20। चर$vफ़ंक्शन समाप्त होने के बाद को इकट्ठा नहीं किया जाता है, क्योंकि यह एक स्थिर (गैर-गतिशील) वेरिएबल है। जब तक स्क्रिप्ट पूरी तरह से समाप्त नहीं हो जाती तब तक चर इसके दायरे में रहेगा।

इसलिए, निम्नलिखित कॉल

a(15);

तब आउटपुट होगा 20, और फिर सेट $vकिया जाएगा 15


9

स्टैटिक उसी तरह से काम करता है जैसे यह एक कक्षा में करता है। चर एक फ़ंक्शन के सभी उदाहरणों में साझा किया जाता है। आपके विशेष उदाहरण में, फ़ंक्शन चलाने के बाद, $ has_run TRUE पर सेट हो जाता है। फ़ंक्शन के सभी भविष्य के रन में $ has_run = TRUE होगा। यह पुनरावर्ती कार्यों में विशेष रूप से उपयोगी है (गिनती पारित करने के लिए एक विकल्प के रूप में)।

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

Http://php.net/manual/en/language.variables.scope.php देखें


3

किसी फ़ंक्शन में स्थिर चर का मतलब है कि आप कितनी बार फ़ंक्शन को कॉल करते हैं, केवल 1 चर है।

<?php

class Foo{
    protected static $test = 'Foo';
    function yourstatic(){
        static $test = 0;
        $test++;
        echo $test . "\n"; 
    }

    function bar(){
        $test = 0;
        $test++;
        echo $test . "\n";
    }
}

$f = new Foo();
$f->yourstatic(); // 1
$f->yourstatic(); // 2
$f->yourstatic(); // 3
$f->bar(); // 1
$f->bar(); // 1
$f->bar(); // 1

?>

3

यांग के जवाब पर विस्तार करने के लिए

यदि आप स्थिर चर के साथ एक वर्ग का विस्तार करते हैं, तो व्यक्तिगत विस्तारित वर्ग अपने "स्वयं" संदर्भित स्थैतिक को धारण करेंगे जो उदाहरणों के बीच साझा किए जाते हैं।

<?php
class base {
     function calc() {
        static $foo = 0;
        $foo++;
        return $foo;
     }
}

class one extends base {
    function e() {
        echo "one:".$this->calc().PHP_EOL;
    }
}
class two extends base {
    function p() {
        echo "two:".$this->calc().PHP_EOL;
    }
}
$x = new one();
$y = new two();
$x_repeat = new one();

$x->e();
$y->p();
$x->e();
$x_repeat->e();
$x->e();
$x_repeat->e();
$y->p();

आउटपुट:

एक: 1
दो : 1
एक: 2
एक : 3 <- x_repeat
एक: 4
एक : 5 <- x_repeat
दो : 2

http://ideone.com/W4W5Qv


1

एक समारोह के अंदर, static अर्थ है कि पेज लोड के जीवन के दौरान फ़ंक्शन को कॉल किए जाने पर चर हर बार अपने मूल्य को बनाए रखेगा।

इसलिए आपके द्वारा दिए गए उदाहरण में, यदि आप किसी फ़ंक्शन को दो बार कॉल करते हैं, यदि वह सेट $has_runकरता है true, तो फ़ंक्शन यह जान सकेगा कि इसे पहले बुलाया गया था क्योंकि फ़ंक्शन तब $has_runभी समान होगा trueजब फ़ंक्शन दूसरी बार प्रारंभ होता है।

staticइस संदर्भ में कीवर्ड का उपयोग यहां PHP मैनुअल में बताया गया है: http://php.net/manual/en/language.variables.scope.php

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