2011-07-01 28 views
10

Görünüşe göre $ pid burada kapsam dışı. Bu işlevle birlikte "kapalı" yapılmamalıdır mı? Oldukça eminim ki javascript'te kapaklar nasıl çalışır.PHP kapatma kapsamı sorunu

php closures are broken, bazı makalelere göre bu erişemiyor?

Peki $ pid bu kapatma fonksiyonu erişilebilir olabilir? Ben kullanımı ile etrafında aldık

class MyClass { 
    static function getHdvdsCol($pid) { 
    $col = new PointColumn(); 
    $col->key = $pid; 
    $col->parser = function($row) { 
     print $pid; // Undefined variable: pid 
    }; 
    return $col; 
    } 
} 

$func = MyClass::getHdvdsCol(45); 
call_user_func($func, $row); 

Düzenleme: $col->parser = function($row) use($pid). Ancak bunun çirkin olduğunu hissediyorum.

+4

O çirkin değildir:

$n = 5; function f() { echo $n; // Undefined variable } 

Sen küresel anahtar sözcüğünü kullanması – zerkms

+0

işte bu yüzden php'de nasıl .. – tradyblix

+0

Bu çirkin bir dil ama ben buna takılıyorum. :( – Keyo

cevap

25

değişkenlerini bu şekilde kapatılmalıdır belirtmek gerekir:

function($row) use ($pid) { ... } 
+0

$ pid yok nerede bu kapatma başka kapsamına bir değişkene kaydedilir ve daha sonra geçirilir edin. , pid erişilebilir bir şekilde kapatılması sarılı ya edilmeyecektir –

+0

@Josh Nankin:?. aslında 'kullanımı ($ var, ...)' kapanışları php nasıl uygulandığını ise başka değişken kapsamına anonim işlevini geçirirseniz Yani - '$ pid' değişken son tanımlanan değerini içerir – zerkms

+1

bu zımbırtı sadece garip hissediyorum yoksa sadece bana ben sadece diğer dillerde kapanışları kullandıktan sonra bunun üstesinden olamaz "kullanmak" mu:/ –

0

Sen bindto yöntemini kullanabilirsiniz.

class MyClass { 
    static function getHdvdsCol($pid) { 
    $col = new PointColumn(); 
    $col->key = $pid; 
    $parser = function($row) { 
     print $this->key; 
    }; 
    $col->parser = $parser->bindTo($parser, $parser); 
    return $col; 
    } 
} 

$func = MyClass::getHdvdsCol(45); 
call_user_func($func, $row); 
-4

PHP'nin değişkenlerin kapsamını belirleme konusunda oldukça tutarlı olduğunu düşünüyorum. Kural, eğer bir değişken bir fonksiyonun dışında tanımlanmışsa, bunu açıkça belirtmelisiniz. Sözcüksel kapsam için 'kullanım' kullanılır, küresel globals için kullanılır.

Örneğin, doğrudan da global değişkeni kullanamazsınız: kapanışları php nasıl çalıştığını

$n = 5; 

function f() 
{ 
    global $n; 
    echo $n; 
}