2011-05-31 14 views
79

मैं ड्रूपल 7 के स्रोत को देख रहा था, और मुझे कुछ चीजें मिलीं जो मैंने पहले नहीं देखी थीं। मैंने कुछ शुरुआती PHP मैनुअल में देखा, लेकिन यह इन उदाहरणों को समझा नहीं गया।'स्थिर' कीवर्ड फ़ंक्शन के अंदर?

कीवर्ड static कोई फ़ंक्शन के अंदर एक चर के लिए क्या करता है?

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

http://php.net/manual/en/language.variables.scope.php – Mahesh

उत्तर

110

यह समारोह अधिक कॉल के बीच दिए गए चर के मूल्य (अपने उदाहरण में $has_run) याद आता है।

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

function doStuff() { 
    static $cache = null; 

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

    // code using $cache 
} 

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

+3

इसके अलावा, अगर समारोह एक बार चलने के बाद, ऐसा नहीं होगा बाद में कॉल पर '$ cache'' 'null' के मान को रीसेट करें, है ना? – user151841

+7

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

+2

क्यों दूसरे कॉल में परिवर्तनीय $ कैश को फिर से शुरू नहीं किया गया है ??? – Muhammad

1

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

इसलिए उदाहरण में आप, दे दिया है कि यदि आप एक समारोह में दो बार फोन है, अगर यह true को $has_run निर्धारित करते हैं, तो समारोह को पता है कि यह पहले से क्योंकि $has_run अभी भी true जब के बराबर होगा बुलाया गया था में सक्षम हो जाएगा समारोह दूसरी बार शुरू होता है। http://php.net/manual/en/language.variables.scope.php

13

निम्न उदाहरण को देखते हुए:

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

a(20); 

इच्छा उत्पादन सबसे पहले कॉल

इस संदर्भ में static कीवर्ड का उपयोग पीएचपी मैनुअल यहाँ से समझाया गया है 10, फिर $v20 होने के लिए। परिवर्तनीय $v फ़ंक्शन समाप्त होने के बाद एकत्रित कचरा नहीं है, क्योंकि यह स्थिर (गैर-गतिशील) चर है। परिवर्तक पूरी तरह से समाप्त होने तक चर अपने दायरे में रहेगा।

इसलिए,

a(15); 

तो उत्पादन 20 होगा के निम्नलिखित कॉल, और फिर सेट $v15 किया जाना है।

8

स्टेटिक उसी तरह काम करता है जैसा यह कक्षा में करता है। चर को किसी फ़ंक्शन के सभी उदाहरणों में साझा किया जाता है। आपके विशेष उदाहरण में, फ़ंक्शन चलाने के बाद, $ has_run TRUE पर सेट हो गया है। फ़ंक्शन के सभी भावी रनों में $__un = 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 

?> 
50

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

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 
2

इस पर विचार करें the answer of Yang

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

<?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_ दोहराने
दो: 2

http://ideone.com/W4W5Qv

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

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