2012-06-03 12 views
23

उदाहरण के लिए, अगर मैं इस कार्य करें:क्या PHP बंद करने में उपयोग कीवर्ड संदर्भ द्वारा पास करता है?

function bar(&$var) 
{ 
    $foo = function() use ($var) 
    { 
     $var++; 
    }; 
    $foo(); 
} 

$my_var = 0; 
bar($my_var); 

$my_var संशोधित किया जाएगा? यदि नहीं, तो $foo पर पैरामीटर जोड़ने के बिना मैं इसे कैसे काम करूं?

+0

नहीं, यह संशोधित नहीं किया जा होगा .. इस पुस्तिका –

उत्तर

39

नहीं, वे संदर्भ द्वारा पारित नहीं कर रहे हैं - use समारोह के मापदंडों की तरह एक समान अंकन इस प्रकार है। आप अपने दम पर मान्य कर सकते हैं कि debug_zval_dump समारोह की मदद (Demo) के साथ:

<?php 
header('Content-Type: text/plain;'); 

function bar(&$var) 
{ 
    $foo = function() use ($var) 
    { 
     debug_zval_dump($var); 
     $var++; 
    }; 
    $foo(); 
}; 

$my_var = 0; 
bar($my_var); 
echo $my_var; 

आउटपुट:

long(0) refcount(3) 
0 

एक पूर्ण के माध्यम से सभी-स्कोप काम संदर्भ का एक refcount होता लिखा 1. के रूप में आप के रूप में उपयोग को परिभाषित करते हुए कि प्राप्त पारित-दर-संदर्भ:

$foo = function() use (&$var) 

यह भी प्रत्यावर्तन इस तरह से बनाने के लिए संभव है:

$func = NULL; 
$func = function() use (&$func) { 
    $func(); 
} 
+1

में शामिल है मैंने देखा है कि मैं इस सर्वश्रेष्ठ उत्तर के रूप में चिह्नित करना भूल गया .. सिर-अप के लिए – elite5472

+0

धन्यवाद! – hakre

+1

एक साल बाद बेहतर कभी नहीं! – elite5472

13

क्लोजर, परिभाषा के अनुसार, मूल्य से बंद हैं, संदर्भ द्वारा नहीं। आप "संदर्भ द्वारा उपयोग" हो सकता है तर्क सूची में एक & जोड़कर:

function() use (&$var) 

यह anonymous functions manual page में उदाहरण के लिए 3 में देखा जा सकता है।

1

नहीं, वे संदर्भ द्वारा पारित नहीं किए गए हैं।

function foo(&$var) 
{ 
    $foo = function() use ($var) 
    { 
     $var++; 
    }; 
    $foo(); 
} 

$my_var = 0; 
foo($my_var); 
echo $my_var; // displays 0 

function bar(&$var) 
{ 
    $foo = function() use (&$var) 
    { 
     $var++; 
    }; 
    $foo(); 
} 

$my_var = 0; 
bar($my_var); 
echo $my_var; // displays 1 
संबंधित मुद्दे