2015-08-06 17 views
7

use(...) ifadesinde hepsini listelemeden lambda işlevine atıfta bulunarak şu anda kapsamdaki herhangi bir değişkeni iletebileceğim bir yol var mı? 13 eşit $foo ve 'bye' eşit $bar sonuçlananPHP, lambda'da [&, epsilon] C++ "Yakalama" değişkenlerine eşdeğerdir?

$foo = 12; 
$bar = 'hello'; 

$run = function() use (&) { 
    $foo = 13; 
    $bar = 'bye'; 
} 

// execute $run function 

gibi

şey.

+2

Kısaca: hayır, kestirme yok. – deceze

+1

A adlandırılmış işlev, 'use' anahtar sözcüğüne izin vermiyor. – Sylwester

+0

@Sylwester bunun için üzgünüm, sorumu düzenledim. –

cevap

1

TL; DR Kısa cevap no.

Değişkenler için değişkenlere ihtiyacın yok. İç içe geçmiş bir sözcük kapsamı olmayacağı için, use'u adlandırılmış işlevlerle kullanmak bile geçerli değildir. Değişkenleri "dinamik" yapmak için global anahtar sözcüğünü kullanın. Özel olan tüm değişkenleri adlandırmanız gerekir. Eğer use anahtar kelime ile tüm değişkenleri isim ve almak için & kullanmaya gerek sözlü bir anonim işlevler için

$foo = 12; 
$bar = 'hello'; 

function run() { 
    global $foo,$bar; 
    $foo = 13; 
    $bar = 'bye'; 
} 

run(); 
print "$foo, $bar\n"; // prints "13, bye" 

o başvurulan:

$foo = 12; 
$bar = 'hello'; 

$run = function() use (&$foo,&$bar) { 
    $foo = 13; 
    $bar = 'bye'; 
}; 
call_user_func($run); 
print "$foo, $bar\n"; // prints "13, bye" 
+0

"Geçerli" kapsamı ve * global * kapsamı mutlaka aynı değildir. Umarım genelde olmazlar. * – deceze

+0

@deceze Bu doğru değil. Örnekte açıkça adlandırılan işlevin başka sözcüksel '$ foo' veya' $ bar' değerine sahip olmadığını görüyorsunuz. Anonim bir işlev olsaydı, konu farklı olurdu. – Sylwester

+0

1) Örnek, geçersiz olduğu için açıkça sahte koddur. 2) OP, * lambda * (anonim) işlevleri ve * "current" * kapsamını açıkça konuşur. Cevabınız, yalnızca en azından açıklığa kavuşturmanız gereken küçük bir kullanım kümesi alt kümesi için yararlıdır. – deceze

0

Sen extract() birlikte get_defined_vars() kullanabilirsiniz:

$foo = 12; 
$bar = 'hello'; 

$vars = get_defined_vars(); 

foreach (array_keys($vars) as $var) { 
    $vars[$var] = &$$var; // keep refs of all variables from current scope 
} 

$run = function() use($vars) { 
    extract($vars, EXTR_REFS); 
    $foo = 13; 
    $bar = 'bye'; 
}; 

// execute $run function 
$run(); 
print $foo; // prints 13 
print $bar; // prints bye 
İlgili konular